lib/inngest/trigger.ex

defmodule Inngest.Trigger do
  @moduledoc """
  Struct representing a function trigger.

  Can either be an `event` or a `cron`, and they're mutually exclusive.

  ## Examples

      # defining an event trigger
      %Inngest.Trigger{event: "auth/signup.email"}

      # defining a cron trigger, and can accept a timezone
      %Inngest.Trigger{cron: "TZ=America/Los_Angeles * * * * *"}
  """

  defstruct [
    :event,
    :expression,
    :cron
  ]

  @type t() :: %__MODULE__{
          # requires `event` and optionaly `expression` for event triggers
          event: binary() | nil,
          expression: binary() | nil,

          # requires `cron` for cron triggers
          cron: binary() | nil
        }
end

defimpl Jason.Encoder, for: Inngest.Trigger do
  def encode(%{cron: cron} = value, opts) when is_binary(cron) do
    value
    |> Map.take([:cron])
    |> Jason.Encode.map(opts)
  end

  def encode(value, opts) do
    value
    |> Map.take([:event, :expression])
    |> Jason.Encode.map(opts)
  end
end