AgentXM.Examples.TinyFlags (AgentXM Example TinyFlags v0.1.0)

Copy Markdown View Source

Tiny feature flags library used by AXM companion package examples.

Flags are defined with AgentXM.Examples.TinyFlags.BooleanFlag.new/1 or AgentXM.Examples.TinyFlags.VariantFlag.new/2 and evaluated through a flag set built with new/1. Rollout decisions are deterministic for a given {flag_name, context_id} pair so the same caller always sees the same answer.

Example

flags =
  AgentXM.Examples.TinyFlags.new!(%{
    "checkout-redesign" =>
      AgentXM.Examples.TinyFlags.BooleanFlag.new!(default: true),
    "search-ranking" =>
      AgentXM.Examples.TinyFlags.VariantFlag.new!(
        ["classic", "semantic"],
        default: "classic",
        rollout: %{"semantic" => 100}
      )
  })

AgentXM.Examples.TinyFlags.enabled?(flags, "checkout-redesign", %{id: "user-1"})
# => true

AgentXM.Examples.TinyFlags.variant(flags, "search-ranking", %{id: "user-1"})
# => {:ok, "semantic"}

Summary

Types

t()

A flag set built with new/1 or new!/1.

Functions

Return the boolean treatment for the named flag.

Convenience wrapper that returns the boolean directly. Raises on error.

Evaluate a flag without knowing its kind ahead of time. Returns a {:boolean, bool} or {:variant, name} tuple.

Return {:ok, flag} or {:error, reason} if the flag is unknown.

Return the registered flag names in lexicographic order.

Build a flag set from a map of flag name to definition.

Like new/1 but raises ArgumentError on invalid input.

Return the named variant treatment for the named flag.

Types

t()

@type t() :: %AgentXM.Examples.TinyFlags{
  definitions: %{
    optional(String.t()) =>
      AgentXM.Examples.TinyFlags.BooleanFlag.t()
      | AgentXM.Examples.TinyFlags.VariantFlag.t()
  }
}

A flag set built with new/1 or new!/1.

Functions

enabled(flags, name, context \\ %{})

@spec enabled(t(), String.t(), AgentXM.Examples.TinyFlags.Context.t() | map()) ::
  {:ok, boolean()} | {:error, term()}

Return the boolean treatment for the named flag.

Returns {:error, reason} when the flag is unknown or is not a boolean flag.

enabled?(flags, name, context \\ %{})

@spec enabled?(t(), String.t(), AgentXM.Examples.TinyFlags.Context.t() | map()) ::
  boolean()

Convenience wrapper that returns the boolean directly. Raises on error.

evaluate(flags, name, context \\ %{})

@spec evaluate(t(), String.t(), AgentXM.Examples.TinyFlags.Context.t() | map()) ::
  {:ok, {:boolean, boolean()} | {:variant, String.t()}} | {:error, term()}

Evaluate a flag without knowing its kind ahead of time. Returns a {:boolean, bool} or {:variant, name} tuple.

fetch(tiny_flags, name)

Return {:ok, flag} or {:error, reason} if the flag is unknown.

names(tiny_flags)

@spec names(t()) :: [String.t()]

Return the registered flag names in lexicographic order.

new(definitions)

@spec new(map()) :: {:ok, t()} | {:error, term()}

Build a flag set from a map of flag name to definition.

Returns {:error, reason} if the map is invalid (nil, non-map, or contains a blank flag name).

new!(definitions)

@spec new!(map()) :: t()

Like new/1 but raises ArgumentError on invalid input.

variant(flags, name, context \\ %{})

@spec variant(t(), String.t(), AgentXM.Examples.TinyFlags.Context.t() | map()) ::
  {:ok, String.t()} | {:error, term()}

Return the named variant treatment for the named flag.

Returns {:error, reason} when the flag is unknown or is not a variant flag.