2017-04-16 21:13:39 +00:00
|
|
|
defmodule RDF.Integer do
|
2017-06-09 22:18:39 +00:00
|
|
|
@moduledoc """
|
|
|
|
`RDF.Datatype` for XSD integer.
|
|
|
|
"""
|
|
|
|
|
2017-04-16 21:13:39 +00:00
|
|
|
use RDF.Datatype, id: RDF.Datatype.NS.XSD.integer
|
|
|
|
|
2018-09-09 13:28:35 +00:00
|
|
|
import RDF.Literal.Guards
|
|
|
|
|
2017-04-23 21:41:29 +00:00
|
|
|
|
2017-04-16 21:13:39 +00:00
|
|
|
def convert(value, _) when is_integer(value), do: value
|
2017-04-23 21:41:29 +00:00
|
|
|
|
|
|
|
def convert(value, opts) when is_binary(value) do
|
|
|
|
case Integer.parse(value) do
|
|
|
|
{integer, ""} -> integer
|
2017-04-26 00:48:49 +00:00
|
|
|
{_, _} -> super(value, opts)
|
2017-04-23 21:41:29 +00:00
|
|
|
:error -> super(value, opts)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def convert(value, opts), do: super(value, opts)
|
2017-04-16 21:13:39 +00:00
|
|
|
|
2018-09-09 13:28:35 +00:00
|
|
|
|
|
|
|
def cast(%RDF.Literal{datatype: datatype} = literal) do
|
|
|
|
cond do
|
|
|
|
not RDF.Literal.valid?(literal) ->
|
|
|
|
nil
|
|
|
|
|
|
|
|
is_xsd_integer(datatype) ->
|
|
|
|
literal
|
|
|
|
|
|
|
|
literal == RDF.false ->
|
|
|
|
new(0)
|
|
|
|
|
|
|
|
literal == RDF.true ->
|
|
|
|
new(1)
|
|
|
|
|
|
|
|
is_xsd_string(datatype) ->
|
2018-09-12 22:57:57 +00:00
|
|
|
case Integer.parse(literal.value) do
|
|
|
|
{value, _} -> new(value)
|
|
|
|
_ -> nil
|
|
|
|
end
|
2018-09-09 13:28:35 +00:00
|
|
|
|
|
|
|
is_xsd_decimal(datatype) ->
|
|
|
|
literal.value
|
|
|
|
|> Decimal.round(0, :down)
|
|
|
|
|> Decimal.to_integer()
|
|
|
|
|> new()
|
|
|
|
|
|
|
|
is_float(literal.value) and
|
|
|
|
(is_xsd_double(datatype) or is_xsd_float(datatype)) ->
|
|
|
|
literal.value
|
|
|
|
|> trunc()
|
|
|
|
|> new()
|
|
|
|
|
|
|
|
true ->
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
2018-06-08 10:26:52 +00:00
|
|
|
def equal_value?(left, right), do: RDF.Numeric.equal_value?(left, right)
|
2017-04-26 00:48:49 +00:00
|
|
|
|
2017-04-16 21:13:39 +00:00
|
|
|
end
|