forking from https://gitea.daggertrout.com/mcdoh/ExMineArchive
This commit is contained in:
30
lib/ex_mine/parse_string.ex
Normal file
30
lib/ex_mine/parse_string.ex
Normal file
@@ -0,0 +1,30 @@
|
||||
defmodule ParseString do
|
||||
def parse(str) when is_binary(str)do
|
||||
case str |> Code.string_to_quoted do
|
||||
{:ok, terms} -> {:ok, _parse(terms)}
|
||||
{:error, _} -> {:invalid_terms}
|
||||
end
|
||||
end
|
||||
|
||||
# atomic terms
|
||||
defp _parse(term) when is_atom(term), do: term
|
||||
defp _parse(term) when is_integer(term), do: term
|
||||
defp _parse(term) when is_float(term), do: term
|
||||
defp _parse(term) when is_binary(term), do: term
|
||||
|
||||
defp _parse([]), do: []
|
||||
defp _parse([h|t]), do: [_parse(h) | _parse(t)]
|
||||
|
||||
defp _parse({a, b}), do: {_parse(a), _parse(b)}
|
||||
defp _parse({:"{}", _place, terms}) do
|
||||
terms
|
||||
|> Enum.map(&_parse/1)
|
||||
|> List.to_tuple
|
||||
end
|
||||
|
||||
defp _parse({:"%{}", _place, terms}) do
|
||||
for {k, v} <- terms, into: %{}, do: {_parse(k), _parse(v)}
|
||||
end
|
||||
|
||||
defp _parse({_term_type, _place, terms}), do: terms # to ignore functions and operators
|
||||
end
|
||||
Reference in New Issue
Block a user