Current section
Files
Jump to
Current section
Files
lib/validator.ex
defmodule FuelCalculator.Validator do
@directives [:land, :launch]
@planets [:earth, :mars, :moon]
@moduledoc """
Documentation for `Validator`.
"""
@doc """
validate/2
Used to check the input for errors
## Examples
iex> FuelCalculator.Validator.validate(23, "hello")
{:error, "Invalid input: paths"}
iex> FuelCalculator.Validator.validate(28801, [{:land, :earth}])
{:ok, [{:land, :earth}]}
"""
@spec validate(number, list(tuple)) :: tuple
def validate(mass, _paths) when not is_integer(mass) or mass <= 0 do
{:error, "Invalid input: mass"}
end
def validate(_mass, paths) when not is_list(paths) do
{:error, "Invalid input: paths"}
end
def validate(_mass, paths) when is_list(paths) do
if Enum.all?(paths, fn path ->
is_tuple(path) &&
validate_directives(path) &&
validate_gravity(path)
end),
do: {:ok, paths},
else: {:error, "Invalid Directive"}
end
defp validate_directives({mode, _gravity}), do: Enum.member?(@directives, mode)
defp validate_gravity({_mode, gravity}) do
is_float(gravity) || Enum.member?(@planets, gravity)
end
end