commit e1dcd39c615dfdbde284f1ebf9d7b0e5a195a913
parent 8cb65841e6e2143ce9669cce80ee48b62adce613
Author: srfsh <dev@srf.sh>
Date: Tue, 2 Aug 2022 15:55:51 +0300
Zenflows.GQL.Type: add base64 type
This allows us to validate input
Diffstat:
1 file changed, 16 insertions(+), 0 deletions(-)
diff --git a/src/zenflows/gql/type.ex b/src/zenflows/gql/type.ex
@@ -29,6 +29,12 @@ scalar :uri, name: "URI" do
serialize & &1
end
+@desc "A base64-encoded (requires padding and ignores whitespace) as String."
+scalar :base64, name: "Base64" do
+ parse &base64_parse/1
+ serialize & &1
+end
+
# TODO: Decide whether we really want these to be valid URIs or just
# Strings.
@spec uri_parse(Input.t()) :: {:ok, String.t() | nil} | :error
@@ -36,6 +42,16 @@ defp uri_parse(%Input.String{value: v}), do: {:ok, v}
defp uri_parse(%Input.Null{}), do: {:ok, nil}
defp uri_parse(_), do: :error
+@spec base64_parse(Input.t()) :: {:ok, String.t() | nil} | :error
+defp base64_parse(%Input.String{value: v}) do
+ case Base.decode64(v, ignore: :whitespace, padding: true) do
+ {:ok, _} -> {:ok, v}
+ :error -> :error
+ end
+end
+defp base64_parse(%Input.Null{}), do: {:ok, nil}
+defp base64_parse(_), do: :error
+
@spec id_parse(Input.t()) :: {:ok, ID.t() | nil} | :error
def id_parse(%Input.String{value: v}), do: ID.cast(v)
def id_parse(%Input.Null{}), do: {:ok, nil}