Packages
xandra
0.1.0
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.18.0-rc.9
0.18.0-rc.8
0.18.0-rc.7
0.18.0-rc.6
0.18.0-rc.5
0.18.0-rc.4
0.18.0-rc.3
0.18.0-rc.2
0.18.0-rc.1
0.17.0
0.16.0
0.15.0
0.15.0-rc.1
0.14.0
0.13.1
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.0
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
Fast, simple, and robust Cassandra driver for Elixir.
Current section
Files
Jump to
Current section
Files
lib/xandra/type_parser.ex
defmodule Xandra.TypeParser do
@moduledoc false
@type type :: atom | {atom, [type]}
@builtin_types [
:text,
:blob,
:ascii,
:bigint,
:counter,
:int,
:varint,
:boolean,
:decimal,
:double,
:float,
:inet,
:timestamp,
:uuid,
:timeuuid,
:date,
:smallint,
:time,
:tinyint,
:map,
:set,
:list,
:tuple,
:empty,
:frozen,
:varchar,
]
@spec parse(String.t) :: type | no_return
def parse(string) when is_binary(string) do
try do
string
|> String.replace(" ", "")
|> String.downcase()
|> parse_type()
catch
:throw, :invalid ->
raise "invalid type: " <> inspect(string)
else
{type, ""} ->
type
{_, _rest} ->
raise "invalid type: " <> inspect(string)
end
end
defp parse_type(chars) do
case parse_plain_type(chars) do
{type, "<" <> rest} ->
case parse_inner(rest) do
{types, ">" <> rest} ->
{{type, types}, rest}
_ ->
throw(:invalid)
end
{type, rest} ->
{type, rest}
end
end
for type <- @builtin_types do
defp parse_plain_type(unquote(Atom.to_string(type)) <> rest) do
{unquote(type), rest}
end
end
defp parse_plain_type(_other) do
throw(:invalid)
end
defp parse_inner(chars) do
case parse_type(chars) do
{type, "," <> rest} ->
{types, rest} = parse_inner(rest)
{[type | types], rest}
{type, rest} ->
{[type], rest}
end
end
end