summaryrefslogtreecommitdiff
path: root/lib/irc/parser/numeric.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/irc/parser/numeric.ex')
-rw-r--r--lib/irc/parser/numeric.ex72
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/irc/parser/numeric.ex b/lib/irc/parser/numeric.ex
new file mode 100644
index 0000000..3a6e27f
--- /dev/null
+++ b/lib/irc/parser/numeric.ex
@@ -0,0 +1,72 @@
+defmodule Irc.Parser.Numeric do
+ require Logger
+
+ @moduledoc """
+ Helpers for using IRC Numerics.
+
+ * Use macros to translate from `rpl_MOTDSTART` (a macro is generated for every numeric name).
+ * Convert a numeric to its name (name_numeric())
+ * Convert a name to its numeric (to_numeric())
+ * Check if a numeric is an error (error_numeric?())
+
+ """
+
+ defmacro __using__(_) do
+ quote do
+ require Irc.Numeric
+ import Irc.Numeric
+ end
+ end
+
+ @numerics File.read!(Path.join(:code.priv_dir(:irc), "numerics.txt"))
+ |> String.split("\n")
+ |> Enum.map(fn(line) ->
+ case String.split(String.trim(line), " ", parts: 2) do
+ ["#"<>_, _] -> nil
+ ["#"<>_] -> nil
+ [numeric, full_name = "ERR_" <> name] -> {numeric, name, true, full_name}
+ [numeric, full_name = "RPL_" <> name] -> {numeric, name, false, full_name}
+ line ->
+ Logger.debug "Invalid line in numeric.txt: #{inspect line}"
+ end
+ end)
+ |> Enum.filter(fn(n) -> n end)
+
+ for {num, name, error, full_name} <- @numerics do
+ prefix = if error, do: "err_", else: "rpl_"
+ fname = "#{prefix}#{name}" |> String.to_atom()
+
+ defmacro unquote(fname)() do
+ unquote(num)
+ end
+
+ def error_numeric?(unquote(num)) do
+ unquote(error)
+ end
+ def error_numeric?(unquote(name)) do
+ unquote(error)
+ end
+ def error_numeric?(unquote(full_name)) do
+ unquote(error)
+ end
+
+ def name_numeric(unquote(num)) do
+ unquote(full_name)
+ end
+
+ def to_numeric(unquote(num)) do
+ unquote(num)
+ end
+ def to_numeric(unquote(name)) do
+ unquote(num)
+ end
+ def to_numeric(unquote(fname)) do
+ unquote(num)
+ end
+ def to_numeric(unquote(full_name)) do
+ unquote(num)
+ end
+
+ end
+
+end