Current section
Files
Jump to
Current section
Files
lib/pote/format/xterm256.ex
defmodule Pote.Format.XTerm256 do
@moduledoc """
XTerm256 format for colours (0-255).
"""
@behaviour Pote.Format
alias Pote.Conversions
@type parsed :: 0..255
@spec parse(any()) :: {:ok, parsed()} | :error
def parse(n) when is_integer(n) and n >= 0 and n <= 255 do
{:ok, n}
end
def parse(str) when is_binary(str) do
sanitized = Pote.Sanitizer.sanitize(str)
case Integer.parse(sanitized) do
{n, ""} when n >= 0 and n <= 255 -> {:ok, n}
_ -> :error
end
end
def parse(_), do: :error
@spec valid?(any()) :: boolean()
def valid?(n) when is_integer(n) and n >= 0 and n <= 255, do: true
def valid?(str) when is_binary(str) do
case Integer.parse(str) do
{n, ""} -> n >= 0 and n <= 255
_ -> false
end
end
def valid?(_), do: false
@spec to_rgb(parsed()) :: {0..255, 0..255, 0..255}
def to_rgb(xterm) do
Conversions.xterm256_to_rgb(xterm)
end
@spec to_hex(parsed()) :: String.t()
def to_hex(xterm) do
xterm |> to_rgb() |> Conversions.rgb_to_hex()
end
@spec to_argb(parsed()) :: {0..255, 0..255, 0..255, 0..255}
def to_argb(xterm) do
{r, g, b} = to_rgb(xterm)
{255, r, g, b}
end
@spec to_hsl(parsed()) :: {float(), float(), float()}
def to_hsl(xterm) do
xterm |> to_rgb() |> Conversions.rgb_to_hsl()
end
@spec to_hsv(parsed()) :: {float(), float(), float()}
def to_hsv(xterm) do
xterm |> to_rgb() |> Conversions.rgb_to_hsv()
end
@spec to_cmyk(parsed()) :: {float(), float(), float(), float()}
def to_cmyk(xterm) do
xterm |> to_rgb() |> Conversions.rgb_to_cmyk()
end
@spec to_xterm256(parsed()) :: non_neg_integer()
def to_xterm256(xterm), do: xterm
@spec name(parsed()) :: String.t() | nil
def name(_parsed), do: nil
@spec from_rgb({0..255, 0..255, 0..255}) :: parsed()
def from_rgb(rgb), do: Conversions.rgb_to_xterm256(rgb)
@spec info(parsed()) :: map()
def info(parsed) do
%{
format: :xterm256,
original: parsed,
parsed: parsed,
rgb: to_rgb(parsed),
hex: to_hex(parsed),
argb: to_argb(parsed),
hsl: to_hsl(parsed),
hsv: to_hsv(parsed),
cmyk: to_cmyk(parsed),
xterm256: parsed,
name: name(parsed)
}
end
end