Packages

Elixir library for feature flags integration with Consul

Current section

Files

Jump to
feature_flipper lib feature_flipper.ex
Raw

lib/feature_flipper.ex

defmodule FeatureFlipper do
@moduledoc """
Main interface for feature flag operations.
FeatureFlipper provides a comprehensive, easy-to-integrate feature flag system
for Elixir applications with Consul integration, caching, and deadline management.
## Configuration
# config/config.exs
config :feature_flipper,
consul_kv_path: "telephony/services/routing",
consul_client_http_addr: "http://consul.query.dev.telnyx.io:18500",
env: System.get_env("ENV", "dev"),
hostname: System.get_env("SERVER_HOSTNAME", "local"),
version_suffix: "1.7.9-rc" # Optional, for production versioning
## Usage
# Define feature flippers
defmodule MyApp.FeatureFlippers do
use FeatureFlipper.Definition
define_flipper :use_warehouse_cache_tbs_2221?, %{
deadline: ~D[2025-06-30],
description: "Use warehouse cache for improved performance"
}
end
# Use feature flippers
if MyApp.FeatureFlippers.use_warehouse_cache_tbs_2221?() do
# Feature is enabled
end
# Or use the main interface
if FeatureFlipper.enabled?(:use_warehouse_cache_tbs_2221?) do
# Feature is enabled
end
"""
alias FeatureFlipper.{ConfigLoader, DeadlineChecker}
@doc """
Check if a feature flipper is enabled.
## Parameters
* `flipper_name` - The name of the feature flipper (atom or string)
## Examples
iex> FeatureFlipper.enabled?(:my_feature)
true
iex> FeatureFlipper.enabled?("my_feature")
false
"""
@spec enabled?(atom() | String.t()) :: boolean()
def enabled?(flipper_name) when is_binary(flipper_name) do
flipper_name
|> String.to_atom()
|> enabled?()
end
def enabled?(flipper_name) when is_atom(flipper_name) do
ConfigLoader.get_flipper_value(flipper_name)
end
@doc """
Reload configuration from Consul.
This function fetches the latest feature flipper configuration from Consul
and updates the local cache.
## Examples
iex> FeatureFlipper.reload_configuration()
:ok
iex> FeatureFlipper.reload_configuration()
{:error, :consul_unavailable}
"""
@spec reload_configuration() :: :ok | {:error, term()}
def reload_configuration do
ConfigLoader.reload_configuration()
end
@doc """
Get all feature flags and their current values.
## Examples
iex> FeatureFlipper.get_all_flags()
%{
my_feature: true,
another_feature: false
}
"""
@spec get_all_flags() :: map()
def get_all_flags do
ConfigLoader.get_all_flags()
end
@doc """
Check for feature flippers that are past their deadline.
Returns a list of warning messages for features that are past their deadline.
## Examples
iex> FeatureFlipper.check_deadlines()
["Feature 'old_feature' is past its deadline of 2024-01-01"]
iex> FeatureFlipper.check_deadlines()
[]
"""
@spec check_deadlines() :: [String.t()]
def check_deadlines do
DeadlineChecker.check_deadlines()
end
end