defmodule ExOpenAi.Resource do
@moduledoc """
The base module for all resources in the ExOpenAi API client.
"""
@doc false
defmacro __using__(options) do
import_functions = options[:import] || []
quote bind_quoted: [import_functions: import_functions] do
alias ExOpenAi.Api
alias ExOpenAi.Parser
@spec new :: %__MODULE__{}
def new, do: %__MODULE__{}
@spec new(attributes :: list) :: %__MODULE__{}
def new(attributes) do
do_new(%__MODULE__{}, attributes)
end
@spec do_new(%__MODULE__{}, attributes :: list) :: %__MODULE__{}
def do_new(struct, []), do: struct
def do_new(struct, [{key, val} | tail]) do
do_new(Map.put(struct, key, val), tail)
end
if :create in import_functions do
@spec create(Api.data(), list) :: Parser.parsed_response()
def create(data, options \\ []), do: Api.create(__MODULE__, data, options)
end
if :create_stream in import_functions do
@spec create_stream(Api.data(), list) :: Parser.parsed_response()
def create_stream(data, options \\ []), do: Api.create_stream(__MODULE__, data, options)
end
if :create_with_file in import_functions do
@spec create_with_file(Api.data(), atom(), list) :: Parser.parsed_response()
def create_with_file(data, file_key, options \\ []), do: Api.create_with_file(__MODULE__, data, options)
end
if :list in import_functions do
@spec list(list) :: Parser.parsed_response()
def list(options \\ []), do: Api.list(__MODULE__, options)
end
if :retrieve in import_functions do
@spec retrieve(String.t(), list) :: Parser.parsed_response()
def retrieve(id, options \\ []), do: Api.retrieve(__MODULE__, id, options)
end
if :remove in import_functions do
@spec remove(String.t(), list) :: Parser.parsed_response()
def remove(id, options \\ []), do: Api.remove(__MODULE__, id, options)
end
defoverridable Module.definitions_in(__MODULE__, :def)
end
end
end