lib/weaviate_structs/class.ex

defmodule Noizu.Weaviate.Struct.Class do
  @moduledoc """
  Struct for representing a class in Weaviate schema.
  """

  defstruct [
    :name,
    :description,
    :vector_index,
    :vector_index_config,
    :vectorizer,
    :module_config,
    :properties,
    :inverted_index_config,
    :replication_config,
    :multi_tenancy_config
  ]

  @type t :: %__MODULE__{
               name: String.t(),
               description: String.t(),
               vector_index: String.t(),
               vector_index_config: Noizu.Weaviate.Struct.VectorIndexConfig.t,
               vectorizer: String.t(),
               module_config: map(),
               properties: list(Noizu.Weaviate.Struct.Property.t()),

               inverted_index_config: Noizu.Weaviate.Struct.InvertedIndexConfig.t,
               replication_config: Noizu.Weaviate.Struct.ReplicationConfig.t,
               multi_tenancy_config: Noizu.Weaviate.Struct.MultiTenancyConfig.t,
             }

  def from_json(json) when is_list(json) do
    Enum.map(json, & from_json(&1))
  end
  def from_json(nil), do: nil
  def from_json(%{} = json) do
    %__MODULE__{
      name: json[:class],
      description: json[:description],
      vector_index: json[:vectorIndex],
      vector_index_config: Noizu.Weaviate.Struct.VectorIndexConfig.from_json(json[:vectorIndexConfig]),
      vectorizer: json[:vectorizer],
      module_config: json[:moduleConfig],
      properties: Noizu.Weaviate.Struct.Property.from_json(json[:properties]),
      inverted_index_config: Noizu.Weaviate.Struct.InvertedIndexConfig.from_json(json[:invertedIndexConfig]),
      replication_config: Noizu.Weaviate.Struct.ReplicationConfig.from_json(json[:replicationConfig]),
      multi_tenancy_config: Noizu.Weaviate.Struct.MultiTenancyConfig.from_json(json[:multiTenancyConfig]),
    }
  end

  defimpl Jason.Encoder do
    def encode(this, opts) do
      %{
        class: this.name,
        description: this.description,
        vectorIndex: this.vector_index,
        vectorIndexConfig: this.vector_index_config,
        vectorizer: this.vectorizer,
        moduleConfig: this.module_config,
        properties: this.properties,
        invertedIndexConfig: this.inverted_index_config,
        replicationConfig: this.replication_config,
        multiTenancyConfig: this.multi_tenancy_config
      }
      |> Enum.reject(fn {k,v} -> is_nil(v) end)
      |> Map.new()
      |> Jason.Encode.map(opts)
    end
  end

end