Packages
Elixir library for various strategies/experiments for avoiding string access to conn params
Current section
Files
Jump to
Current section
Files
lib/indifferent_params.ex
defmodule IndifferentAccess.IndifferentParams do
alias __MODULE__
defstruct params: %{}
@behaviour Access
def new(params) do
%IndifferentParams{params: params}
end
@impl Access
def fetch(%IndifferentParams{params: params}, key) when is_atom(key) do
initial_value = Map.fetch(params, key)
if initial_value != :error, do: initial_value, else: Map.fetch(params, to_string(key))
end
def fetch(%IndifferentParams{params: params}, key) do
Map.fetch(params, key)
end
def get(container, key, default \\ nil)
def get(%IndifferentParams{params: params}, key, default) when is_atom(key) do
initial_value = Map.get(params, key, default)
if initial_value, do: initial_value, else: Map.get(params, to_string(key), default)
end
def get(%IndifferentParams{params: params}, key, default) do
Map.get(params, key, default)
end
@impl Access
def get_and_update(%IndifferentParams{params: params}, key, fun) when is_atom(key) do
initial_value = Map.get(params, key)
update_key = if initial_value, do: key, else: to_string(key)
{get_value, new_params} = Map.get_and_update(params, update_key, fun)
{get_value, %__MODULE__{params: new_params}}
end
def get_and_update(%IndifferentParams{params: params}, key, fun) do
{get_value, new_params} = Map.get_and_update(params, key, fun)
{get_value, %__MODULE__{params: new_params}}
end
@impl Access
def pop(container, key, default \\ nil)
def pop(%IndifferentParams{params: params}, key, default) when is_atom(key) do
initial_value = Map.get(params, key)
pop_key = if initial_value, do: key, else: to_string(key)
{get_value, new_params} = Map.pop(params, pop_key, default)
{get_value, %__MODULE__{params: new_params}}
end
def pop(%IndifferentParams{params: params}, key, default) do
{get_value, new_params} = Map.pop(params, key, default)
{get_value, %__MODULE__{params: new_params}}
end
end