decimal.ex (1236B)
1 if Code.ensure_loaded?(Decimal) do 2 defmodule Absinthe.Type.Custom.Decimal do 3 @moduledoc false 4 5 defdelegate serialize(value), to: Decimal, as: :to_string 6 7 alias Absinthe.Blueprint.Input 8 9 @dialyzer {:no_match, parse: 1} 10 @spec parse(any) :: {:ok, Decimal.t()} | {:ok, nil} | :error 11 def parse(%Input.String{value: value}) when is_binary(value) do 12 case Decimal.parse(value) do 13 # Decimal V2 14 {decimal, ""} -> {:ok, decimal} 15 # Decimal V1 16 {:ok, decimal} -> {:ok, decimal} 17 _ -> :error 18 end 19 end 20 21 def parse(%Input.Float{value: value}) when is_float(value) do 22 decimal = Decimal.from_float(value) 23 if Decimal.nan?(decimal), do: :error, else: {:ok, decimal} 24 end 25 26 def parse(%Input.Integer{value: value}) when is_integer(value) do 27 decimal = Decimal.new(value) 28 if Decimal.nan?(decimal), do: :error, else: {:ok, decimal} 29 end 30 31 def parse(%Input.Null{}) do 32 {:ok, nil} 33 end 34 35 def parse(_) do 36 :error 37 end 38 end 39 else 40 defmodule Absinthe.Type.Custom.Decimal do 41 @moduledoc false 42 43 @spec parse(any) :: :error 44 def parse(_), do: :error 45 46 @spec serialize(any) :: nil 47 def serialize(_), do: nil 48 end 49 end