Current section

Files

Jump to
ducky src ducky@types.erl
Raw

src/ducky@types.erl

-module(ducky@types).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/ducky/types.gleam").
-export([field/2, get/2]).
-export_type([value/0, row/0, data_frame/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(" Type mappings between DuckDB and Gleam.\n").
-type value() :: null |
{boolean, boolean()} |
{tiny_int, integer()} |
{small_int, integer()} |
{integer, integer()} |
{big_int, integer()} |
{float, float()} |
{double, float()} |
{text, binary()} |
{blob, bitstring()} |
{timestamp, integer()} |
{date, integer()} |
{time, integer()} |
{interval, integer()} |
{list, list(value())} |
{struct, gleam@dict:dict(binary(), value())}.
-type row() :: {row, list(value())}.
-type data_frame() :: {data_frame, list(binary()), list(row())}.
-file("src/ducky/types.gleam", 57).
?DOC(
" Get a field value from a struct by field name.\n"
"\n"
" Returns None if the value is not a Struct or the field does not exist.\n"
"\n"
" ## Examples\n"
"\n"
" ```gleam\n"
" let person = Struct(dict.from_list([#(\"name\", Text(\"Alice\")), #(\"age\", Integer(30))]))\n"
" field(person, \"name\")\n"
" // => Some(Text(\"Alice\"))\n"
"\n"
" field(person, \"unknown\")\n"
" // => None\n"
" ```\n"
).
-spec field(value(), binary()) -> gleam@option:option(value()).
field(Value, Name) ->
case Value of
{struct, Fields} ->
_pipe = gleam_stdlib:map_get(Fields, Name),
gleam@option:from_result(_pipe);
_ ->
none
end.
-file("src/ducky/types.gleam", 64).
-spec list_at(list(DUE), integer()) -> gleam@option:option(DUE).
list_at(List, Index) ->
case {List, Index} of
{[], _} ->
none;
{[First | _], 0} ->
{some, First};
{[_ | Rest], N} when N > 0 ->
list_at(Rest, N - 1);
{_, _} ->
none
end.
-file("src/ducky/types.gleam", 37).
?DOC(" Get a value from a row by column index.\n").
-spec get(row(), integer()) -> gleam@option:option(value()).
get(Row, Index) ->
case Row of
{row, Values} ->
list_at(Values, Index)
end.