lib/draft/validator/pattern.ex

defmodule Draft.Validator.Pattern do
    alias Draft.Patterns
    use Draft.Validator

    def validate(value, class) when is_atom(class) do
        pattern = Patterns.pattern(class)
        validate(value, {class, pattern})
    end

    def validate(_value, {class, nil}) do
        {:error, "invalid pattern #{class}"}
    end

    def validate(value, {class, %Regex{}=pattern}) do
        matched =
            String.Chars.to_string(value)
            |> String.match?(pattern)

        if matched do
            {:ok, value}
        else
            {:error, "must match pattern #{class}"}
        end
    end

end