-module(openfeature@api). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([get_provider_metadata/0, get_client/0, set_provider/1, set_context/1, set_domain_provider/2, get_domain_provider_metadata/1, get_domain_client/1, shutdown/0]). -spec get_provider() -> openfeature@provider:feature_provider(). get_provider() -> persistent_term:get( <<"global_openfeature_provider"/utf8>>, openfeature@providers@no_op:provider() ). -spec get_provider_metadata() -> openfeature@provider:metadata(). get_provider_metadata() -> (erlang:element(4, get_provider()))(). -spec get_client() -> openfeature@client:client(). get_client() -> {client, get_provider(), {client_metadata, global}}. -spec set_provider(openfeature@provider:feature_provider()) -> {ok, nil} | {error, nil}. set_provider(Provider) -> persistent_term:put(<<"global_openfeature_provider"/utf8>>, Provider), Context = persistent_term:get( <<"global_openfeature_context"/utf8>>, openfeature@evaluation_context:empty() ), (erlang:element(2, Provider))(Context). -spec set_context(openfeature@evaluation_context:evaluation_context()) -> nil. set_context(Context) -> persistent_term:put(<<"global_openfeature_context"/utf8>>, Context). -spec get_domain_provider_registry() -> gleam@dict:dict(binary(), openfeature@provider:feature_provider()). get_domain_provider_registry() -> persistent_term:get( <<"openfeature_domain_providers"/utf8>>, gleam@dict:new() ). -spec set_domain_provider(binary(), openfeature@provider:feature_provider()) -> nil. set_domain_provider(Domain, Provider) -> _pipe = get_domain_provider_registry(), _pipe@1 = gleam@dict:insert(_pipe, Domain, Provider), persistent_term:put(<<"openfeature_domain_providers"/utf8>>, _pipe@1). -spec get_domain_provider(binary()) -> openfeature@provider:feature_provider(). get_domain_provider(Domain) -> _pipe = get_domain_provider_registry(), _pipe@1 = gleam@dict:get(_pipe, Domain), gleam@result:unwrap(_pipe@1, get_provider()). -spec get_domain_provider_metadata(binary()) -> openfeature@provider:metadata(). get_domain_provider_metadata(Domain) -> (erlang:element(4, get_domain_provider(Domain)))(). -spec get_domain_client(binary()) -> openfeature@client:client(). get_domain_client(Domain) -> {client, get_domain_provider(Domain), {client_metadata, {scoped, Domain}}}. -spec shutdown() -> boolean(). shutdown() -> _pipe = get_domain_provider_registry(), _pipe@1 = gleam@dict:values(_pipe), _pipe@2 = gleam@list:prepend(_pipe@1, get_provider()), gleam@list:each( _pipe@2, fun(Provider) -> (erlang:element(3, Provider))() end ), persistent_term:erase(<<"openfeature_domain_providers"/utf8>>), persistent_term:erase(<<"global_openfeature_provider"/utf8>>), persistent_term:erase(<<"global_openfeature_context"/utf8>>).