diff options
Diffstat (limited to 'lib/irc/parser/numeric.ex')
-rw-r--r-- | lib/irc/parser/numeric.ex | 72 |
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 |