lib/notion/filter.ex

defmodule Notion.Filter do
  @moduledoc """
  Filter
  """

  alias Notion.PropertyFilter

  defstruct or: [],
            and: []

  @type t() :: %__MODULE__{
          or: [PropertyFilter.t()],
          and: [PropertyFilter.t()]
        }
end

defimpl Jason.Encoder, for: Notion.Filter do
  def encode(value, opts) do
    value
    |> Map.from_struct()
    |> Enum.reject(fn {_, v} -> is_nil(v) || Enum.empty?(v) end)
    |> Enum.into(%{})
    |> Jason.Encode.map(opts)
  end
end