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, :vector_config, :sharding_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, vector_config: map(), sharding_config: map(), } 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]), vector_config: json[:vectorConfig], sharding_config: json[:shardingConfig], } 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, vectorConfig: this.vector_config, shardingConfig: this.sharding_config } |> Enum.reject(fn {k,v} -> is_nil(v) end) |> Map.new() |> Jason.Encode.map(opts) end end end