diff options
Diffstat (limited to 'lib/irc/mask.ex')
-rw-r--r-- | lib/irc/mask.ex | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/irc/mask.ex b/lib/irc/mask.ex new file mode 100644 index 0000000..5106c26 --- /dev/null +++ b/lib/irc/mask.ex @@ -0,0 +1,52 @@ +defmodule Irc.Mask do + + @type t :: %__MODULE__{nick: nil | String.t(), user: nil | String.t(), host: nil | String.t(), server: nil | String.t()} + defstruct [:nick, :user, :host, :server] + + @spec parse(String.t) :: {:ok, t()} | {:error, :invalid_mask} + def parse(string) do + cond do + String.contains?(string, "!") -> parse_user_mask(string) + String.contains?(string, ".") -> parse_server_mask(string) + true -> {:error, :invalid_mask} + end + end + + def new(nick, user, host) do + %__MODULE__{nick: nick, user: user, host: host} + end + + def to_string(%__MODULE__{server: nil, nick: nick, user: user, host: host}) do + Enum.join([nick, "!", user, "@", host]) + end + + def to_string(%__MODULE__{server: server}), do: server + + defp parse_user_mask(string) do + case String.split(string, ~r/[!@]/, parts: 3) do + [nick, user, host] -> + {:ok, %__MODULE__{nick: nick, user: user, host: host}} + _ -> + {:error, :invalid_mask} + end + end + + defp parse_server_mask(string) do + {:ok, %__MODULE__{server: string}} + end + + defimpl String.Chars, for: __MODULE__ do + @moduledoc false + defdelegate to_string(struct), to: Irc.Mask + end + + defimpl Inspect, for: __MODULE__ do + @moduledoc false + import Inspect.Algebra + + def inspect(struct, _opts) do + concat(["#Irc.Mask<", Irc.Mask.to_string(struct), ">"]) + end + end + +end |