Packages
openfeature_elixir
0.1.0
OpenFeature is an open specification that provides a vendor-agnostic, community-driven API for feature flagging that works with your favorite feature flag management tool.
Current section
Files
Jump to
Current section
Files
lib/OpenFeature/client.ex
defmodule OpenFeature.Client do
@moduledoc """
Client for OpenFeature.
"""
alias OpenFeature.{Context}
defstruct [:name, :pid, :local_context]
def new() do
new(nil)
end
def new(name) do
case :ets.whereis(name || __MODULE__) do
:undefined ->
:ets.new(name || __MODULE__, [:named_table, read_concurrency: true])
_ ->
nil
end
%OpenFeature.Client{
name: name,
local_context: nil
}
end
defp get_client_name(%OpenFeature.Client{name: name}) do
name || __MODULE__
end
def get_provider(%OpenFeature.Client{} = client) do
# Check if we have a provider already
case :ets.lookup(get_client_name(client), "provider") do
[{_, {provider, args}}] ->
{provider, args}
# Check if we have a default provider
_ ->
case OpenFeature.get_provider() do
{provider, args} ->
{provider, args}
_ ->
nil
end
end
end
defp get_bool(%OpenFeature.Client{} = client, name, default, context) do
case get_provider(client) do
{provider, args} ->
context =
Context.rollup_context(OpenFeature.get_global_context(), get_context(client), context)
provider.get_boolean_value(args, name, default, context)
_ ->
default
end
end
defp get_string(%OpenFeature.Client{} = client, name, default, context) do
case get_provider(client) do
{provider, args} ->
context =
Context.rollup_context(OpenFeature.get_global_context(), get_context(client), context)
provider.get_string_value(args, name, default, context)
_ ->
default
end
end
def set_context(%OpenFeature.Client{} = client, context) do
:ets.insert(get_client_name(client), {"local_context", context})
client
end
def get_context(%OpenFeature.Client{} = client) do
case :ets.lookup(get_client_name(client), "local_context") do
[{_, context}] ->
context
_ ->
Context.new_targetless_context(%{})
end
end
def set_provider(%OpenFeature.Client{} = client, provider, args) do
{:ok} = provider.init(args)
:ets.insert(get_client_name(client), {"provider", {provider, args}})
client
end
def get_boolean_value(%OpenFeature.Client{} = client, name, default)
when is_boolean(default) do
get_bool(client, name, default, Context.new_targetless_context(%{}))
end
def get_boolean_value(
%OpenFeature.Client{} = client,
name,
default,
%OpenFeature.Context{} = context
)
when is_boolean(default) do
get_bool(client, name, default, context)
end
def get_string_value(%OpenFeature.Client{} = client, name, default)
when is_binary(default) do
get_string(client, name, default, Context.new_targetless_context(%{}))
end
def get_string_value(
%OpenFeature.Client{} = client,
name,
default,
%OpenFeature.Context{} = context
)
when is_binary(default) do
get_string(client, name, default, context)
end
end