Packages

An idiomatic, high-performance, and lightweight Meilisearch client for Elixir built on top of Req and Finch.

Current section

Files

Jump to
meili lib meili.ex
Raw

lib/meili.ex

defmodule Meili do
@moduledoc """
An idiomatic, high-performance Meilisearch client for Elixir.
"""
alias Meili.Client
@doc """
Builds a custom `Meili.Client` instance with the given options.
## Options
* `:url` or `:endpoint` - The Meilisearch base URL (default: `http://localhost:7700`).
* `:key` or `:api_key` - The API key or master key for authentication.
* `:req_options` - Custom configuration options passed directly to `Req.new/1`.
"""
@spec client(Keyword.t() | map()) :: Client.t()
def client(opts \\ []) do
Client.new(opts)
end
@doc """
Builds a `Meili.Client` from the global application environment.
"""
@spec default_client() :: Client.t()
def default_client do
config = Application.get_all_env(:meili)
Client.new(config)
end
# --- Search Delegates ---
@spec search(
Client.t() | String.t(),
String.t(),
String.t() | Keyword.t(),
Keyword.t()
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate search(client_or_uid, uid_or_query, query_or_opts \\ [], opts \\ []),
to: Meili.Search
@spec search!(
Client.t() | String.t(),
String.t(),
String.t() | Keyword.t(),
Keyword.t()
) :: map() | no_return()
defdelegate search!(client_or_uid, uid_or_query, query_or_opts \\ [], opts \\ []),
to: Meili.Search
@spec search_similar(
Client.t() | String.t(),
String.t() | map(),
map() | Keyword.t(),
Keyword.t()
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate search_similar(client_or_uid, uid_or_body, body_or_opts \\ [], opts \\ []),
to: Meili.Search,
as: :similar
@spec search_similar!(
Client.t() | String.t(),
String.t() | map(),
map() | Keyword.t(),
Keyword.t()
) :: map() | no_return()
defdelegate search_similar!(client_or_uid, uid_or_body, body_or_opts \\ [], opts \\ []),
to: Meili.Search,
as: :similar!
# --- Document Delegates ---
@spec get_document(
Client.t() | String.t(),
String.t() | integer(),
String.t() | integer() | Keyword.t(),
Keyword.t()
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate get_document(client_or_uid, uid_or_doc_id, doc_id_or_opts \\ [], opts \\ []),
to: Meili.Document,
as: :get
@spec get_document!(
Client.t() | String.t(),
String.t() | integer(),
String.t() | integer() | Keyword.t(),
Keyword.t()
) :: map() | no_return()
defdelegate get_document!(client_or_uid, uid_or_doc_id, doc_id_or_opts \\ [], opts \\ []),
to: Meili.Document,
as: :get!
@spec add_documents(
Client.t() | String.t(),
String.t() | list(map()),
list(map()) | Keyword.t(),
Keyword.t()
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate add_documents(client_or_uid, uid_or_documents, documents_or_opts \\ [], opts \\ []),
to: Meili.Document,
as: :add_or_replace
@spec add_documents!(
Client.t() | String.t(),
String.t() | list(map()),
list(map()) | Keyword.t(),
Keyword.t()
) :: map() | no_return()
defdelegate add_documents!(
client_or_uid,
uid_or_documents,
documents_or_opts \\ [],
opts \\ []
), to: Meili.Document, as: :add_or_replace!
@spec update_documents(
Client.t() | String.t(),
String.t() | list(map()),
list(map()) | Keyword.t(),
Keyword.t()
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate update_documents(
client_or_uid,
uid_or_documents,
documents_or_opts \\ [],
opts \\ []
), to: Meili.Document, as: :add_or_update
@spec update_documents!(
Client.t() | String.t(),
String.t() | list(map()),
list(map()) | Keyword.t(),
Keyword.t()
) :: map() | no_return()
defdelegate update_documents!(
client_or_uid,
uid_or_documents,
documents_or_opts \\ [],
opts \\ []
), to: Meili.Document, as: :add_or_update!
@spec delete_document(
Client.t() | String.t(),
String.t() | integer(),
String.t() | integer() | nil
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate delete_document(client_or_uid, uid_or_doc_id, doc_id_or_nil \\ nil),
to: Meili.Document,
as: :delete
@spec delete_document!(
Client.t() | String.t(),
String.t() | integer(),
String.t() | integer() | nil
) :: map() | no_return()
defdelegate delete_document!(client_or_uid, uid_or_doc_id, doc_id_or_nil \\ nil),
to: Meili.Document,
as: :delete!
@spec edit_documents(
Client.t() | String.t(),
String.t() | map(),
map() | Keyword.t(),
Keyword.t()
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate edit_documents(client_or_uid, uid_or_queries, queries_or_opts \\ [], opts \\ []),
to: Meili.Document,
as: :edit
@spec edit_documents!(
Client.t() | String.t(),
String.t() | map(),
map() | Keyword.t(),
Keyword.t()
) :: map() | no_return()
defdelegate edit_documents!(client_or_uid, uid_or_queries, queries_or_opts \\ [], opts \\ []),
to: Meili.Document,
as: :edit!
# --- Index Delegates ---
@spec create_index(
Client.t() | String.t(),
String.t() | Keyword.t() | map(),
Keyword.t() | map()
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate create_index(client_or_uid, uid_or_opts \\ [], opts \\ []),
to: Meili.Index,
as: :create
@spec create_index!(
Client.t() | String.t(),
String.t() | Keyword.t() | map(),
Keyword.t() | map()
) :: map() | no_return()
defdelegate create_index!(client_or_uid, uid_or_opts \\ [], opts \\ []),
to: Meili.Index,
as: :create!
@spec delete_index(Client.t() | String.t(), String.t() | nil) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate delete_index(client_or_uid, uid_or_nil \\ nil), to: Meili.Index, as: :delete
@spec delete_index!(Client.t() | String.t(), String.t() | nil) :: map() | no_return()
defdelegate delete_index!(client_or_uid, uid_or_nil \\ nil), to: Meili.Index, as: :delete!
@spec get_index(Client.t() | String.t(), String.t() | nil) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate get_index(client_or_uid, uid_or_nil \\ nil), to: Meili.Index, as: :get
@spec get_index!(Client.t() | String.t(), String.t() | nil) :: map() | no_return()
defdelegate get_index!(client_or_uid, uid_or_nil \\ nil), to: Meili.Index, as: :get!
@spec list_indexes(Client.t() | Keyword.t() | nil, Keyword.t()) ::
{:ok, list() | map()} | {:error, Meili.Error.t()}
defdelegate list_indexes(client_or_opts \\ nil, opts \\ []), to: Meili.Index, as: :list
@spec list_indexes!(Client.t() | Keyword.t() | nil, Keyword.t()) ::
list() | map() | no_return()
defdelegate list_indexes!(client_or_opts \\ nil, opts \\ []), to: Meili.Index, as: :list!
@spec compact_index(Client.t() | String.t(), String.t() | nil) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate compact_index(client_or_uid, uid_or_nil \\ nil), to: Meili.Index, as: :compact
@spec compact_index!(Client.t() | String.t(), String.t() | nil) :: map() | no_return()
defdelegate compact_index!(client_or_uid, uid_or_nil \\ nil), to: Meili.Index, as: :compact!
# --- Task Delegates ---
@spec wait_for_task(
Client.t() | integer() | String.t(),
integer() | String.t() | Keyword.t(),
Keyword.t()
) :: {:ok, map()} | {:error, :timeout | Meili.Error.t()}
defdelegate wait_for_task(client_or_uid, uid_or_opts \\ [], opts \\ []), to: Meili.Task
@spec wait_for_task!(
Client.t() | integer() | String.t(),
integer() | String.t() | Keyword.t(),
Keyword.t()
) :: map() | no_return()
defdelegate wait_for_task!(client_or_uid, uid_or_opts \\ [], opts \\ []), to: Meili.Task
# --- Token Delegates ---
@spec generate_tenant_token(String.t() | nil, map() | nil, String.t() | nil, Keyword.t()) ::
{:ok, String.t()} | {:error, :missing_secret | :invalid_uid | :missing_search_rules}
defdelegate generate_tenant_token(api_key_uid, search_rules, secret \\ nil, opts \\ []),
to: Meili.Token,
as: :generate
@spec generate_tenant_token!(String.t() | nil, map() | nil, String.t() | nil, Keyword.t()) ::
String.t() | no_return()
defdelegate generate_tenant_token!(api_key_uid, search_rules, secret \\ nil, opts \\ []),
to: Meili.Token,
as: :generate!
# --- Dump Delegates ---
@spec create_dump(Client.t() | nil) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate create_dump(client \\ nil), to: Meili.Dump, as: :create
@spec create_dump!(Client.t() | nil) :: map() | no_return()
defdelegate create_dump!(client \\ nil), to: Meili.Dump, as: :create!
# --- Batch Delegates ---
@spec get_batch(Client.t() | integer() | String.t(), integer() | String.t() | nil) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate get_batch(client_or_uid, uid_or_nil \\ nil), to: Meili.Batch, as: :get
@spec get_batch!(Client.t() | integer() | String.t(), integer() | String.t() | nil) ::
map() | no_return()
defdelegate get_batch!(client_or_uid, uid_or_nil \\ nil), to: Meili.Batch, as: :get!
@spec list_batches(Client.t() | Keyword.t() | nil, Keyword.t()) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate list_batches(client_or_opts \\ nil, opts \\ []), to: Meili.Batch, as: :list
@spec list_batches!(Client.t() | Keyword.t() | nil, Keyword.t()) :: map() | no_return()
defdelegate list_batches!(client_or_opts \\ nil, opts \\ []), to: Meili.Batch, as: :list!
# --- Chat Delegates ---
@spec chat_completions(
Client.t() | String.t(),
String.t() | map() | nil,
map() | Keyword.t(),
Keyword.t()
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate chat_completions(
client_or_workspace,
workspace_or_body \\ nil,
body_or_opts \\ [],
opts \\ []
),
to: Meili.Chat,
as: :completions
@spec chat_completions!(
Client.t() | String.t(),
String.t() | map() | nil,
map() | Keyword.t(),
Keyword.t()
) :: map() | no_return()
defdelegate chat_completions!(
client_or_workspace,
workspace_or_body \\ nil,
body_or_opts \\ [],
opts \\ []
),
to: Meili.Chat,
as: :completions!
# --- Snapshot Delegates ---
@spec create_snapshot(Client.t() | nil) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate create_snapshot(client \\ nil), to: Meili.Snapshot, as: :create
@spec create_snapshot!(Client.t() | nil) :: map() | no_return()
defdelegate create_snapshot!(client \\ nil), to: Meili.Snapshot, as: :create!
# --- Dynamic Search Rules Delegates ---
@spec list_dynamic_search_rules(Client.t() | Keyword.t() | nil, Keyword.t()) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate list_dynamic_search_rules(client_or_opts \\ nil, opts \\ []),
to: Meili.DynamicSearchRules,
as: :list
@spec list_dynamic_search_rules!(Client.t() | Keyword.t() | nil, Keyword.t()) ::
map() | no_return()
defdelegate list_dynamic_search_rules!(client_or_opts \\ nil, opts \\ []),
to: Meili.DynamicSearchRules,
as: :list!
@spec get_dynamic_search_rule(Client.t() | String.t(), String.t() | nil) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate get_dynamic_search_rule(client_or_uid, uid_or_nil \\ nil),
to: Meili.DynamicSearchRules,
as: :get
@spec get_dynamic_search_rule!(Client.t() | String.t(), String.t() | nil) ::
map() | no_return()
defdelegate get_dynamic_search_rule!(client_or_uid, uid_or_nil \\ nil),
to: Meili.DynamicSearchRules,
as: :get!
@spec update_dynamic_search_rule(
Client.t() | String.t(),
String.t() | map() | Keyword.t() | nil,
map() | Keyword.t() | nil
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate update_dynamic_search_rule(
client_or_uid,
uid_or_params \\ nil,
params_or_nil \\ nil
),
to: Meili.DynamicSearchRules,
as: :update
@spec update_dynamic_search_rule!(
Client.t() | String.t(),
String.t() | map() | Keyword.t() | nil,
map() | Keyword.t() | nil
) :: map() | no_return()
defdelegate update_dynamic_search_rule!(
client_or_uid,
uid_or_params \\ nil,
params_or_nil \\ nil
),
to: Meili.DynamicSearchRules,
as: :update!
@spec delete_dynamic_search_rule(Client.t() | String.t(), String.t() | nil) ::
{:ok, term()} | {:error, Meili.Error.t()}
defdelegate delete_dynamic_search_rule(client_or_uid, uid_or_nil \\ nil),
to: Meili.DynamicSearchRules,
as: :delete
@spec delete_dynamic_search_rule!(Client.t() | String.t(), String.t() | nil) ::
term() | no_return()
defdelegate delete_dynamic_search_rule!(client_or_uid, uid_or_nil \\ nil),
to: Meili.DynamicSearchRules,
as: :delete!
# --- Export Delegates ---
@spec create_export(Client.t() | map() | Keyword.t(), map() | Keyword.t(), Keyword.t()) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate create_export(client_or_params, params_or_opts \\ [], opts \\ []),
to: Meili.Export,
as: :create
@spec create_export!(Client.t() | map() | Keyword.t(), map() | Keyword.t(), Keyword.t()) ::
map() | no_return()
defdelegate create_export!(client_or_params, params_or_opts \\ [], opts \\ []),
to: Meili.Export,
as: :create!
# --- Webhook Delegates ---
@spec list_webhooks(Client.t() | nil) :: {:ok, term()} | {:error, Meili.Error.t()}
defdelegate list_webhooks(client \\ nil), to: Meili.Webhook, as: :list
@spec list_webhooks!(Client.t() | nil) :: term() | no_return()
defdelegate list_webhooks!(client \\ nil), to: Meili.Webhook, as: :list!
@spec get_webhook(Client.t() | String.t(), String.t() | nil) ::
{:ok, term()} | {:error, Meili.Error.t()}
defdelegate get_webhook(client_or_uuid, uuid_or_nil \\ nil), to: Meili.Webhook, as: :get
@spec get_webhook!(Client.t() | String.t(), String.t() | nil) :: term() | no_return()
defdelegate get_webhook!(client_or_uuid, uuid_or_nil \\ nil), to: Meili.Webhook, as: :get!
@spec create_webhook(Client.t() | map() | list(), map() | list() | nil) ::
{:ok, term()} | {:error, Meili.Error.t()}
defdelegate create_webhook(client_or_params, params_or_nil \\ nil),
to: Meili.Webhook,
as: :create
@spec create_webhook!(Client.t() | map() | list(), map() | list() | nil) :: term() | no_return()
defdelegate create_webhook!(client_or_params, params_or_nil \\ nil),
to: Meili.Webhook,
as: :create!
@spec update_webhook(
Client.t() | String.t(),
String.t() | map() | list() | nil,
map() | list() | nil
) :: {:ok, term()} | {:error, Meili.Error.t()}
defdelegate update_webhook(client_or_uuid, uuid_or_params \\ nil, params_or_nil \\ nil),
to: Meili.Webhook,
as: :update
@spec update_webhook!(
Client.t() | String.t(),
String.t() | map() | list() | nil,
map() | list() | nil
) :: term() | no_return()
defdelegate update_webhook!(client_or_uuid, uuid_or_params \\ nil, params_or_nil \\ nil),
to: Meili.Webhook,
as: :update!
@spec delete_webhook(Client.t() | String.t(), String.t() | nil) ::
{:ok, term()} | {:error, Meili.Error.t()}
defdelegate delete_webhook(client_or_uuid, uuid_or_nil \\ nil), to: Meili.Webhook, as: :delete
@spec delete_webhook!(Client.t() | String.t(), String.t() | nil) :: term() | no_return()
defdelegate delete_webhook!(client_or_uuid, uuid_or_nil \\ nil), to: Meili.Webhook, as: :delete!
# --- Key Delegates ---
@spec list_keys(Client.t() | Keyword.t() | nil, Keyword.t()) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate list_keys(client_or_opts \\ nil, opts \\ []), to: Meili.Key, as: :list
@spec list_keys!(Client.t() | Keyword.t() | nil, Keyword.t()) :: map() | no_return()
defdelegate list_keys!(client_or_opts \\ nil, opts \\ []), to: Meili.Key, as: :list!
@spec get_key(Client.t() | String.t(), String.t() | nil) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate get_key(client_or_key, key_or_nil \\ nil), to: Meili.Key, as: :get
@spec get_key!(Client.t() | String.t(), String.t() | nil) :: map() | no_return()
defdelegate get_key!(client_or_key, key_or_nil \\ nil), to: Meili.Key, as: :get!
@spec create_key(Client.t() | map() | Keyword.t(), map() | Keyword.t() | nil) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate create_key(client_or_params, params_or_nil \\ nil), to: Meili.Key, as: :create
@spec create_key!(Client.t() | map() | Keyword.t(), map() | Keyword.t() | nil) ::
map() | no_return()
defdelegate create_key!(client_or_params, params_or_nil \\ nil), to: Meili.Key, as: :create!
@spec update_key(
Client.t() | String.t(),
String.t() | map() | Keyword.t() | nil,
map() | Keyword.t() | nil
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate update_key(client_or_key, key_or_params \\ nil, params_or_nil \\ nil),
to: Meili.Key,
as: :update
@spec update_key!(
Client.t() | String.t(),
String.t() | map() | Keyword.t() | nil,
map() | Keyword.t() | nil
) :: map() | no_return()
defdelegate update_key!(client_or_key, key_or_params \\ nil, params_or_nil \\ nil),
to: Meili.Key,
as: :update!
@spec delete_key(Client.t() | String.t(), String.t() | nil) ::
{:ok, term()} | {:error, Meili.Error.t()}
defdelegate delete_key(client_or_key, key_or_nil \\ nil), to: Meili.Key, as: :delete
@spec delete_key!(Client.t() | String.t(), String.t() | nil) :: term() | no_return()
defdelegate delete_key!(client_or_key, key_or_nil \\ nil), to: Meili.Key, as: :delete!
# --- Settings Delegates ---
@spec get_settings(Client.t() | String.t(), String.t() | nil) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate get_settings(client_or_uid, uid_or_nil \\ nil), to: Meili.Settings, as: :get
@spec get_settings!(Client.t() | String.t(), String.t() | nil) :: map() | no_return()
defdelegate get_settings!(client_or_uid, uid_or_nil \\ nil), to: Meili.Settings, as: :get!
@spec update_settings(
Client.t() | String.t(),
String.t() | map() | Keyword.t() | nil,
map() | Keyword.t() | nil
) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate update_settings(client_or_uid, uid_or_settings \\ [], settings_or_nil \\ []),
to: Meili.Settings,
as: :update
@spec update_settings!(
Client.t() | String.t(),
String.t() | map() | Keyword.t() | nil,
map() | Keyword.t() | nil
) :: map() | no_return()
defdelegate update_settings!(client_or_uid, uid_or_settings \\ [], settings_or_nil \\ []),
to: Meili.Settings,
as: :update!
@spec reset_settings(Client.t() | String.t(), String.t() | nil) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate reset_settings(client_or_uid, uid_or_nil \\ nil), to: Meili.Settings, as: :reset
@spec reset_settings!(Client.t() | String.t(), String.t() | nil) :: map() | no_return()
defdelegate reset_settings!(client_or_uid, uid_or_nil \\ nil), to: Meili.Settings, as: :reset!
# --- Experimental Features Delegates ---
@spec get_experimental_features(Client.t() | nil) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate get_experimental_features(client \\ nil), to: Meili.Features, as: :get
@spec get_experimental_features!(Client.t() | nil) :: map() | no_return()
defdelegate get_experimental_features!(client \\ nil), to: Meili.Features, as: :get!
@spec update_experimental_features(Client.t() | map() | Keyword.t(), map() | Keyword.t() | nil) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate update_experimental_features(client_or_features, features_or_nil \\ nil),
to: Meili.Features,
as: :update
@spec update_experimental_features!(
Client.t() | map() | Keyword.t(),
map() | Keyword.t() | nil
) :: map() | no_return()
defdelegate update_experimental_features!(client_or_features, features_or_nil \\ nil),
to: Meili.Features,
as: :update!
# --- Network Delegates ---
@spec get_network(Client.t() | nil) :: {:ok, map()} | {:error, Meili.Error.t()}
defdelegate get_network(client \\ nil), to: Meili.Network, as: :get
@spec get_network!(Client.t() | nil) :: map() | no_return()
defdelegate get_network!(client \\ nil), to: Meili.Network, as: :get!
@spec update_network(Client.t() | map() | Keyword.t(), map() | Keyword.t() | nil) ::
{:ok, map()} | {:error, Meili.Error.t()}
defdelegate update_network(client_or_params, params_or_nil \\ nil),
to: Meili.Network,
as: :update
@spec update_network!(Client.t() | map() | Keyword.t(), map() | Keyword.t() | nil) ::
map() | no_return()
defdelegate update_network!(client_or_params, params_or_nil \\ nil),
to: Meili.Network,
as: :update!
end