summaryrefslogtreecommitdiff
path: root/lib/irc/mask.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/irc/mask.ex')
-rw-r--r--lib/irc/mask.ex52
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