Skip to main content

lib/kiwi_codec/schema.ex

defmodule KiwiCodec.Schema do
  @moduledoc """
  Parsed Kiwi schema.
  """

  alias KiwiCodec.Schema.Enum, as: SchemaEnum
  alias KiwiCodec.Schema.{Message, Struct}

  @type definition :: SchemaEnum.t() | Struct.t() | Message.t()
  @type t :: %__MODULE__{package: String.t() | nil, definitions: [definition()]}

  defstruct package: nil, definitions: []

  @spec native_type?(String.t()) :: boolean()
  def native_type?(type), do: KiwiCodec.PrimitiveType.name?(type)

  @spec definition(t(), String.t()) :: definition() | nil
  def definition(%__MODULE__{definitions: definitions}, name) do
    Elixir.Enum.find(definitions, &(&1.name == name))
  end
end

defmodule KiwiCodec.Schema.Enum do
  @moduledoc """
  Kiwi enum definition.
  """

  alias KiwiCodec.Schema.EnumVariant

  @type t :: %__MODULE__{
          name: String.t(),
          variants: [EnumVariant.t()],
          line: non_neg_integer(),
          column: non_neg_integer()
        }

  defstruct name: nil,
            variants: [],
            line: 0,
            column: 0
end

defmodule KiwiCodec.Schema.Struct do
  @moduledoc """
  Kiwi struct definition.
  """

  alias KiwiCodec.Schema.Field

  @type t :: %__MODULE__{
          name: String.t(),
          fields: [Field.t()],
          line: non_neg_integer(),
          column: non_neg_integer()
        }

  defstruct name: nil,
            fields: [],
            line: 0,
            column: 0
end

defmodule KiwiCodec.Schema.Message do
  @moduledoc """
  Kiwi message definition.
  """

  alias KiwiCodec.Schema.Field

  @type t :: %__MODULE__{
          name: String.t(),
          fields: [Field.t()],
          line: non_neg_integer(),
          column: non_neg_integer()
        }

  defstruct name: nil,
            fields: [],
            line: 0,
            column: 0
end

defmodule KiwiCodec.Schema.Field do
  @moduledoc """
  Kiwi struct or message field.
  """

  @type t :: %__MODULE__{
          name: String.t(),
          type: String.t(),
          array?: boolean(),
          deprecated?: boolean(),
          id: pos_integer(),
          line: non_neg_integer(),
          column: non_neg_integer()
        }

  defstruct name: nil,
            type: nil,
            array?: false,
            deprecated?: false,
            id: nil,
            line: 0,
            column: 0
end

defmodule KiwiCodec.Schema.EnumVariant do
  @moduledoc """
  Kiwi enum variant.
  """

  @type t :: %__MODULE__{
          name: String.t(),
          value: integer(),
          line: non_neg_integer(),
          column: non_neg_integer()
        }

  defstruct name: nil,
            value: nil,
            line: 0,
            column: 0
end