defmodule EditorConfig.Properties do @moduledoc "Optional typed helpers for resolved EditorConfig property maps." @doc """ Reads `indent_size` as a positive integer or `:tab`. ## Examples iex> EditorConfig.Properties.indent_size(%{"indent_size" => "2"}) {:ok, 2} iex> EditorConfig.Properties.indent_size(%{"indent_size" => "tab"}) {:ok, :tab} """ @spec indent_size(map()) :: {:ok, pos_integer() | :tab} | :error def indent_size(%{"indent_size" => "tab"}), do: {:ok, :tab} def indent_size(%{"indent_size" => value}) do case Integer.parse(value) do {int, ""} when int > 0 -> {:ok, int} _invalid -> :error end end def indent_size(_props), do: :error @doc """ Reads a case-insensitive boolean property. ## Examples iex> EditorConfig.Properties.boolean( ...> %{"trim_trailing_whitespace" => "TRUE"}, ...> "trim_trailing_whitespace" ...> ) {:ok, true} """ @spec boolean(map(), String.t()) :: {:ok, boolean()} | :error def boolean(props, key) do case Map.fetch(props, key) do {:ok, value} -> parse_boolean(String.downcase(value)) :error -> :error end end defp parse_boolean("true"), do: {:ok, true} defp parse_boolean("false"), do: {:ok, false} defp parse_boolean(_value), do: :error end