-module(openfeature@api). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([set_provider/1, get_provider_metadata/0, set_context/1, set_domain_provider/2, get_domain_provider_metadata/1, get_domain_client/1, get_client/0]). -export_type([api/0]). -type api() :: {api, openfeature@provider:feature_provider(), openfeature@evaluation_context:evaluation_context()}. -spec default_api() -> api(). default_api() -> {api, openfeature@providers@no_op:provider(), {evaluation_context, none, gleam@dict:new()}}. -spec set_provider(openfeature@provider:feature_provider()) -> {ok, nil} | {error, nil}. set_provider(Provider) -> Api = persistent_term:get(<<"openfeature_api"/utf8>>, default_api()), New_api = {api, Provider, erlang:element(3, Api)}, persistent_term:put(<<"openfeature_api"/utf8>>, New_api), (erlang:element(2, Provider))(erlang:element(3, Api)). -spec get_provider() -> openfeature@provider:feature_provider(). get_provider() -> erlang:element( 2, persistent_term:get(<<"openfeature_api"/utf8>>, default_api()) ). -spec get_provider_metadata() -> openfeature@provider:metadata(). get_provider_metadata() -> (erlang:element( 4, erlang:element( 2, persistent_term:get(<<"openfeature_api"/utf8>>, default_api()) ) ))(). -spec set_context(openfeature@evaluation_context:evaluation_context()) -> nil. set_context(Context) -> Api = persistent_term:get(<<"openfeature_api"/utf8>>, default_api()), New_api = {api, erlang:element(2, Api), Context}, persistent_term:put(<<"openfeature_api"/utf8>>, New_api). -spec set_domain_provider(binary(), openfeature@provider:feature_provider()) -> nil. set_domain_provider(Domain, Provider) -> persistent_term:put(<<"domain_provider__"/utf8, Domain/binary>>, Provider). -spec get_domain_provider(binary()) -> openfeature@provider:feature_provider(). get_domain_provider(Domain) -> persistent_term:get( <<"domain_provider__"/utf8, Domain/binary>>, get_provider() ). -spec get_domain_provider_metadata(binary()) -> openfeature@provider:metadata(). get_domain_provider_metadata(Domain) -> (erlang:element( 4, persistent_term:get( <<"domain_provider__"/utf8, Domain/binary>>, get_provider() ) ))(). -spec get_domain_client(binary()) -> openfeature@client:client(). get_domain_client(Domain) -> {client, get_domain_provider(Domain), {client_metadata, Domain}}. -spec get_client() -> openfeature@client:client(). get_client() -> {client, get_provider(), {client_metadata, <<""/utf8>>}}.