-module(squirrel@internal@query). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/squirrel/internal/query.gleam"). -export([add_types/3, from_file/1, generate_code/3]). -export_type([untyped_query/0, typed_query/0, parameter/0, code_gen_state/0, enum_code_gen_data/0, required_helpers/0, type_position/0, publicity/0, context/0, name/0, splitters/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(false). -type untyped_query() :: {untyped_query, binary(), integer(), squirrel@internal@gleam:value_identifier(), list(binary()), binary()}. -type typed_query() :: {typed_query, binary(), integer(), squirrel@internal@gleam:value_identifier(), list(binary()), binary(), list(parameter()), list(squirrel@internal@gleam:field())}. -type parameter() :: {parameter, gleam@option:option(squirrel@internal@gleam:value_identifier()), squirrel@internal@gleam:type()}. -type code_gen_state() :: {code_gen_state, gleam@dict:dict(binary(), gleam@set:set(binary())), boolean(), gleam@dict:dict(squirrel@internal@gleam:type_identifier(), enum_code_gen_data())}. -type enum_code_gen_data() :: {enum_code_gen_data, required_helpers(), binary(), non_empty_list:non_empty_list(squirrel@internal@gleam:enum_variant())}. -type required_helpers() :: needs_encoder_and_decoder | needs_decoder | needs_encoder | no_helpers. -type type_position() :: enum_field | function_argument. -type publicity() :: public | private. -type context() :: no_identifier | {query_parameter, integer()} | {query_parameter_equality, integer()} | {identifier, name()} | {identifier_equality, name()}. -type name() :: {column, binary()} | {table_and_column, binary(), binary()}. -type splitters() :: {splitters, splitter:splitter(), splitter:splitter(), splitter:splitter()}. -file("src/squirrel/internal/query.gleam", 98). ?DOC(false). -spec duplicate_names(list(squirrel@internal@gleam:field())) -> list(binary()). duplicate_names(Fields) -> Names = begin gleam@list:fold( Fields, tote@bag:new(), fun(Bag, _use1) -> {field, Label, _} = _use1, tote@bag:insert( Bag, 1, squirrel@internal@gleam:value_identifier_to_string(Label) ) end ) end, tote@bag:fold( Names, [], fun(Duplicate_names, Field, Copies) -> case Copies of 1 -> Duplicate_names; _ -> [Field | Duplicate_names] end end ). -file("src/squirrel/internal/query.gleam", 1248). ?DOC(false). -spec pick_name(list(name())) -> {ok, squirrel@internal@gleam:value_identifier()} | {error, nil}. pick_name(Names) -> gleam@list:find_map( lists:reverse(Names), fun(Name) -> Name@2 = case Name of {column, Name@1} -> justin:snake_case(Name@1); {table_and_column, Table, Column} -> Column@1 = gleam_stdlib:string_remove_prefix(Column, Table), <<<<(justin:snake_case(Table))/binary, "_"/utf8>>/binary, (justin:snake_case(Column@1))/binary>> end, squirrel@internal@gleam:value_identifier(Name@2) end ). -file("src/squirrel/internal/query.gleam", 1261). ?DOC(false). -spec add_name(gleam@dict:dict(ORS, list(ORT)), ORS, ORT) -> gleam@dict:dict(ORS, list(ORT)). add_name(Names, Parameter, Name) -> gleam@dict:upsert(Names, Parameter, fun(Existing) -> case Existing of {some, Existing@1} -> [Name | Existing@1]; none -> [Name] end end). -file("src/squirrel/internal/query.gleam", 1680). ?DOC(false). -spec recover_from_error( splitters(), binary(), gleam@dict:dict(integer(), list(name())) ) -> gleam@dict:dict(integer(), list(name())). recover_from_error(Splitters, Query, Names) -> {_, _, Query@1} = splitter_ffi:split(erlang:element(2, Splitters), Query), parameter_names_loop(Splitters, Query@1, no_identifier, Names). -file("src/squirrel/internal/query.gleam", 1656). ?DOC(false). -spec add_parameter( splitters(), binary(), integer(), context(), gleam@dict:dict(integer(), list(name())) ) -> gleam@dict:dict(integer(), list(name())). add_parameter(Splitters, Query, Parameter, Context, Names) -> case Context of no_identifier -> parameter_names_loop( Splitters, Query, {query_parameter, Parameter}, Names ); {identifier, _} -> parameter_names_loop( Splitters, Query, {query_parameter, Parameter}, Names ); {query_parameter, _} -> parameter_names_loop( Splitters, Query, {query_parameter, Parameter}, Names ); {query_parameter_equality, _} -> parameter_names_loop(Splitters, Query, no_identifier, Names); {identifier_equality, Identifier} -> Names@1 = add_name(Names, Parameter, Identifier), parameter_names_loop(Splitters, Query, no_identifier, Names@1) end. -file("src/squirrel/internal/query.gleam", 1397). ?DOC(false). -spec parameter_loop( splitters(), binary(), context(), integer(), gleam@dict:dict(integer(), list(name())) ) -> gleam@dict:dict(integer(), list(name())). parameter_loop(Splitters, Query, Context, Number, Names) -> case Query of <<"0"/utf8, Query@1/binary>> -> parameter_loop(Splitters, Query@1, Context, Number * 10, Names); <<"1"/utf8, Query@2/binary>> -> parameter_loop( Splitters, Query@2, Context, (Number * 10) + 1, Names ); <<"2"/utf8, Query@3/binary>> -> parameter_loop( Splitters, Query@3, Context, (Number * 10) + 2, Names ); <<"3"/utf8, Query@4/binary>> -> parameter_loop( Splitters, Query@4, Context, (Number * 10) + 3, Names ); <<"4"/utf8, Query@5/binary>> -> parameter_loop( Splitters, Query@5, Context, (Number * 10) + 4, Names ); <<"5"/utf8, Query@6/binary>> -> parameter_loop( Splitters, Query@6, Context, (Number * 10) + 5, Names ); <<"6"/utf8, Query@7/binary>> -> parameter_loop( Splitters, Query@7, Context, (Number * 10) + 6, Names ); <<"7"/utf8, Query@8/binary>> -> parameter_loop( Splitters, Query@8, Context, (Number * 10) + 7, Names ); <<"8"/utf8, Query@9/binary>> -> parameter_loop( Splitters, Query@9, Context, (Number * 10) + 8, Names ); <<"9"/utf8, Query@10/binary>> -> parameter_loop( Splitters, Query@10, Context, (Number * 10) + 9, Names ); <<""/utf8>> -> add_parameter(Splitters, Query, Number, Context, Names); <<" "/utf8, _/binary>> -> add_parameter(Splitters, Query, Number, Context, Names); <<"\n"/utf8, _/binary>> -> add_parameter(Splitters, Query, Number, Context, Names); <<"\r"/utf8, _/binary>> -> add_parameter(Splitters, Query, Number, Context, Names); <<"\t"/utf8, _/binary>> -> add_parameter(Splitters, Query, Number, Context, Names); _ -> recover_from_error(Splitters, Query, Names) end. -file("src/squirrel/internal/query.gleam", 1634). ?DOC(false). -spec add_identifier( splitters(), binary(), name(), context(), gleam@dict:dict(integer(), list(name())) ) -> gleam@dict:dict(integer(), list(name())). add_identifier(Splitters, Query, Identifier, Context, Names) -> case Context of {identifier_equality, _} -> parameter_names_loop( Splitters, Query, {identifier, Identifier}, Names ); {identifier, _} -> parameter_names_loop( Splitters, Query, {identifier, Identifier}, Names ); no_identifier -> parameter_names_loop( Splitters, Query, {identifier, Identifier}, Names ); {query_parameter, _} -> parameter_names_loop( Splitters, Query, {identifier, Identifier}, Names ); {query_parameter_equality, Number} -> Names@1 = add_name(Names, Number, Identifier), parameter_names_loop(Splitters, Query, no_identifier, Names@1) end. -file("src/squirrel/internal/query.gleam", 1576). ?DOC(false). -spec dotted_identifier_loop( splitters(), binary(), context(), binary(), binary(), gleam@dict:dict(integer(), list(name())) ) -> gleam@dict:dict(integer(), list(name())). dotted_identifier_loop(Splitters, Query, Context, Table, Column, Names) -> case Query of <<"a"/utf8, Query@1/binary>> -> Letter = <<"a"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"b"/utf8, Query@1/binary>> -> Letter = <<"b"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"c"/utf8, Query@1/binary>> -> Letter = <<"c"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"d"/utf8, Query@1/binary>> -> Letter = <<"d"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"e"/utf8, Query@1/binary>> -> Letter = <<"e"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"f"/utf8, Query@1/binary>> -> Letter = <<"f"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"g"/utf8, Query@1/binary>> -> Letter = <<"g"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"h"/utf8, Query@1/binary>> -> Letter = <<"h"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"i"/utf8, Query@1/binary>> -> Letter = <<"i"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"j"/utf8, Query@1/binary>> -> Letter = <<"j"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"k"/utf8, Query@1/binary>> -> Letter = <<"k"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"l"/utf8, Query@1/binary>> -> Letter = <<"l"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"m"/utf8, Query@1/binary>> -> Letter = <<"m"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"n"/utf8, Query@1/binary>> -> Letter = <<"n"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"o"/utf8, Query@1/binary>> -> Letter = <<"o"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"p"/utf8, Query@1/binary>> -> Letter = <<"p"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"q"/utf8, Query@1/binary>> -> Letter = <<"q"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"r"/utf8, Query@1/binary>> -> Letter = <<"r"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"s"/utf8, Query@1/binary>> -> Letter = <<"s"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"t"/utf8, Query@1/binary>> -> Letter = <<"t"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"u"/utf8, Query@1/binary>> -> Letter = <<"u"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"v"/utf8, Query@1/binary>> -> Letter = <<"v"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"w"/utf8, Query@1/binary>> -> Letter = <<"w"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"x"/utf8, Query@1/binary>> -> Letter = <<"x"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"y"/utf8, Query@1/binary>> -> Letter = <<"y"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"z"/utf8, Query@1/binary>> -> Letter = <<"z"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"0"/utf8, Query@1/binary>> -> Letter = <<"0"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"1"/utf8, Query@1/binary>> -> Letter = <<"1"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"2"/utf8, Query@1/binary>> -> Letter = <<"2"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"3"/utf8, Query@1/binary>> -> Letter = <<"3"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"4"/utf8, Query@1/binary>> -> Letter = <<"4"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"5"/utf8, Query@1/binary>> -> Letter = <<"5"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"6"/utf8, Query@1/binary>> -> Letter = <<"6"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"7"/utf8, Query@1/binary>> -> Letter = <<"7"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"8"/utf8, Query@1/binary>> -> Letter = <<"8"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"9"/utf8, Query@1/binary>> -> Letter = <<"9"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); <<"_"/utf8, Query@1/binary>> -> Letter = <<"_"/utf8>>, Column@1 = <>, dotted_identifier_loop( Splitters, Query@1, Context, Table, Column@1, Names ); _ -> Name = {table_and_column, Table, Column}, add_identifier(Splitters, Query, Name, Context, Names) end. -file("src/squirrel/internal/query.gleam", 1549). ?DOC(false). -spec dotted_identifier( splitters(), binary(), context(), binary(), gleam@dict:dict(integer(), list(name())) ) -> gleam@dict:dict(integer(), list(name())). dotted_identifier(Splitters, Query, Context, Table, Names) -> case Query of <<"\""/utf8, Query@1/binary>> -> case gleam@string:split_once(Query@1, <<"\""/utf8>>) of {error, _} -> Names; {ok, {Column, Query@2}} -> Name = {table_and_column, Table, Column}, add_identifier(Splitters, Query@2, Name, Context, Names) end; _ -> dotted_identifier_loop( Splitters, Query, Context, Table, <<""/utf8>>, Names ) end. -file("src/squirrel/internal/query.gleam", 1494). ?DOC(false). -spec identifier_loop( splitters(), binary(), binary(), context(), gleam@dict:dict(integer(), list(name())) ) -> gleam@dict:dict(integer(), list(name())). identifier_loop(Splitters, Query, Identifier, Context, Names) -> case Query of <<"a"/utf8, Query@1/binary>> -> Letter = <<"a"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"b"/utf8, Query@1/binary>> -> Letter = <<"b"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"c"/utf8, Query@1/binary>> -> Letter = <<"c"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"d"/utf8, Query@1/binary>> -> Letter = <<"d"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"e"/utf8, Query@1/binary>> -> Letter = <<"e"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"f"/utf8, Query@1/binary>> -> Letter = <<"f"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"g"/utf8, Query@1/binary>> -> Letter = <<"g"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"h"/utf8, Query@1/binary>> -> Letter = <<"h"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"i"/utf8, Query@1/binary>> -> Letter = <<"i"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"j"/utf8, Query@1/binary>> -> Letter = <<"j"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"k"/utf8, Query@1/binary>> -> Letter = <<"k"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"l"/utf8, Query@1/binary>> -> Letter = <<"l"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"m"/utf8, Query@1/binary>> -> Letter = <<"m"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"n"/utf8, Query@1/binary>> -> Letter = <<"n"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"o"/utf8, Query@1/binary>> -> Letter = <<"o"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"p"/utf8, Query@1/binary>> -> Letter = <<"p"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"q"/utf8, Query@1/binary>> -> Letter = <<"q"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"r"/utf8, Query@1/binary>> -> Letter = <<"r"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"s"/utf8, Query@1/binary>> -> Letter = <<"s"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"t"/utf8, Query@1/binary>> -> Letter = <<"t"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"u"/utf8, Query@1/binary>> -> Letter = <<"u"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"v"/utf8, Query@1/binary>> -> Letter = <<"v"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"w"/utf8, Query@1/binary>> -> Letter = <<"w"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"x"/utf8, Query@1/binary>> -> Letter = <<"x"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"y"/utf8, Query@1/binary>> -> Letter = <<"y"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"z"/utf8, Query@1/binary>> -> Letter = <<"z"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"0"/utf8, Query@1/binary>> -> Letter = <<"0"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"1"/utf8, Query@1/binary>> -> Letter = <<"1"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"2"/utf8, Query@1/binary>> -> Letter = <<"2"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"3"/utf8, Query@1/binary>> -> Letter = <<"3"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"4"/utf8, Query@1/binary>> -> Letter = <<"4"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"5"/utf8, Query@1/binary>> -> Letter = <<"5"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"6"/utf8, Query@1/binary>> -> Letter = <<"6"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"7"/utf8, Query@1/binary>> -> Letter = <<"7"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"8"/utf8, Query@1/binary>> -> Letter = <<"8"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"9"/utf8, Query@1/binary>> -> Letter = <<"9"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"_"/utf8, Query@1/binary>> -> Letter = <<"_"/utf8>>, identifier_loop( Splitters, Query@1, <>, Context, Names ); <<"."/utf8, Query@2/binary>> -> dotted_identifier(Splitters, Query@2, Context, Identifier, Names); _ -> add_identifier( Splitters, Query, {column, Identifier}, Context, Names ) end. -file("src/squirrel/internal/query.gleam", 1439). ?DOC(false). -spec string_loop( splitters(), binary(), gleam@dict:dict(integer(), list(name())) ) -> gleam@dict:dict(integer(), list(name())). string_loop(Splitters, Query, Names) -> case splitter_ffi:split(erlang:element(4, Splitters), Query) of {_, <<"'"/utf8>>, Query@1} -> parameter_names_loop(Splitters, Query@1, no_identifier, Names); {_, <<"''"/utf8>>, Query@2} -> string_loop(Splitters, Query@2, Names); {_, <<"\\'"/utf8>>, Query@2} -> string_loop(Splitters, Query@2, Names); {_, _, _} -> Names end. -file("src/squirrel/internal/query.gleam", 1460). ?DOC(false). -spec multiline_comment_loop( splitters(), binary(), context(), integer(), gleam@dict:dict(integer(), list(name())) ) -> gleam@dict:dict(integer(), list(name())). multiline_comment_loop( Splitters, Query, Context, Expected_closing_sequences, Names ) -> case Expected_closing_sequences of 0 -> parameter_names_loop(Splitters, Query, Context, Names); _ -> case splitter_ffi:split(erlang:element(3, Splitters), Query) of {_, <<"*/"/utf8>>, Query@1} -> multiline_comment_loop( Splitters, Query@1, Context, Expected_closing_sequences - 1, Names ); {_, <<"/*"/utf8>>, Query@2} -> multiline_comment_loop( Splitters, Query@2, Context, Expected_closing_sequences + 1, Names ); _ -> Names end end. -file("src/squirrel/internal/query.gleam", 1274). ?DOC(false). -spec parameter_names_loop( splitters(), binary(), context(), gleam@dict:dict(integer(), list(name())) ) -> gleam@dict:dict(integer(), list(name())). parameter_names_loop(Splitters, Query, Context, Names) -> case Query of <<"/*"/utf8, Query@1/binary>> -> multiline_comment_loop(Splitters, Query@1, Context, 1, Names); <<"--"/utf8, Query@2/binary>> -> case gleam@string:split_once(Query@2, <<"\n"/utf8>>) of {error, _} -> Names; {ok, {_, Query@3}} -> parameter_names_loop(Splitters, Query@3, Context, Names) end; <<"'"/utf8, Query@4/binary>> -> string_loop(Splitters, Query@4, Names); <<" "/utf8, Query@5/binary>> -> parameter_names_loop(Splitters, Query@5, Context, Names); <<"\n"/utf8, Query@5/binary>> -> parameter_names_loop(Splitters, Query@5, Context, Names); <<"\r"/utf8, Query@5/binary>> -> parameter_names_loop(Splitters, Query@5, Context, Names); <<"\t"/utf8, Query@5/binary>> -> parameter_names_loop(Splitters, Query@5, Context, Names); <<"\""/utf8, Query@6/binary>> -> case gleam@string:split_once(Query@6, <<"\""/utf8>>) of {error, _} -> Names; {ok, {Identifier, <<"."/utf8, Query@7/binary>>}} -> dotted_identifier( Splitters, Query@7, Context, Identifier, Names ); {ok, {Identifier@1, Query@8}} -> add_identifier( Splitters, Query@8, {column, Identifier@1}, Context, Names ) end; <<"a"/utf8, Query@9/binary>> -> Letter = <<"a"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"b"/utf8, Query@9/binary>> -> Letter = <<"b"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"c"/utf8, Query@9/binary>> -> Letter = <<"c"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"d"/utf8, Query@9/binary>> -> Letter = <<"d"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"e"/utf8, Query@9/binary>> -> Letter = <<"e"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"f"/utf8, Query@9/binary>> -> Letter = <<"f"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"g"/utf8, Query@9/binary>> -> Letter = <<"g"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"h"/utf8, Query@9/binary>> -> Letter = <<"h"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"i"/utf8, Query@9/binary>> -> Letter = <<"i"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"j"/utf8, Query@9/binary>> -> Letter = <<"j"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"k"/utf8, Query@9/binary>> -> Letter = <<"k"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"l"/utf8, Query@9/binary>> -> Letter = <<"l"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"m"/utf8, Query@9/binary>> -> Letter = <<"m"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"n"/utf8, Query@9/binary>> -> Letter = <<"n"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"o"/utf8, Query@9/binary>> -> Letter = <<"o"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"p"/utf8, Query@9/binary>> -> Letter = <<"p"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"q"/utf8, Query@9/binary>> -> Letter = <<"q"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"r"/utf8, Query@9/binary>> -> Letter = <<"r"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"s"/utf8, Query@9/binary>> -> Letter = <<"s"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"t"/utf8, Query@9/binary>> -> Letter = <<"t"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"u"/utf8, Query@9/binary>> -> Letter = <<"u"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"v"/utf8, Query@9/binary>> -> Letter = <<"v"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"w"/utf8, Query@9/binary>> -> Letter = <<"w"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"x"/utf8, Query@9/binary>> -> Letter = <<"x"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"y"/utf8, Query@9/binary>> -> Letter = <<"y"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"z"/utf8, Query@9/binary>> -> Letter = <<"z"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"_"/utf8, Query@9/binary>> -> Letter = <<"_"/utf8>>, identifier_loop(Splitters, Query@9, Letter, Context, Names); <<"$1"/utf8, Query@10/binary>> -> parameter_loop(Splitters, Query@10, Context, 1, Names); <<"$2"/utf8, Query@11/binary>> -> parameter_loop(Splitters, Query@11, Context, 2, Names); <<"$3"/utf8, Query@12/binary>> -> parameter_loop(Splitters, Query@12, Context, 3, Names); <<"$4"/utf8, Query@13/binary>> -> parameter_loop(Splitters, Query@13, Context, 4, Names); <<"$5"/utf8, Query@14/binary>> -> parameter_loop(Splitters, Query@14, Context, 5, Names); <<"$6"/utf8, Query@15/binary>> -> parameter_loop(Splitters, Query@15, Context, 6, Names); <<"$7"/utf8, Query@16/binary>> -> parameter_loop(Splitters, Query@16, Context, 7, Names); <<"$8"/utf8, Query@17/binary>> -> parameter_loop(Splitters, Query@17, Context, 8, Names); <<"$9"/utf8, Query@18/binary>> -> parameter_loop(Splitters, Query@18, Context, 9, Names); <<"="/utf8, Query@19/binary>> -> case Context of no_identifier -> recover_from_error(Splitters, Query@19, Names); {query_parameter_equality, _} -> recover_from_error(Splitters, Query@19, Names); {identifier_equality, _} -> recover_from_error(Splitters, Query@19, Names); {query_parameter, Parameter} -> parameter_names_loop( Splitters, Query@19, {query_parameter_equality, Parameter}, Names ); {identifier, Identifier@2} -> parameter_names_loop( Splitters, Query@19, {identifier_equality, Identifier@2}, Names ) end; <<""/utf8>> -> Names; _ -> recover_from_error(Splitters, Query, Names) end. -file("src/squirrel/internal/query.gleam", 1230). ?DOC(false). -spec parameter_names(binary()) -> gleam@dict:dict(integer(), squirrel@internal@gleam:value_identifier()). parameter_names(Query) -> Query@1 = string:lowercase(Query), Splitters = {splitters, splitter:new( [<<" "/utf8>>, <<"\n"/utf8>>, <<"\t"/utf8>>, <<"\r"/utf8>>] ), splitter:new([<<"/*"/utf8>>, <<"*/"/utf8>>]), splitter:new([<<"''"/utf8>>, <<"\\'"/utf8>>, <<"'"/utf8>>])}, _pipe = parameter_names_loop(Splitters, Query@1, no_identifier, maps:new()), gleam@dict:fold( _pipe, maps:new(), fun(Acc, Parameter, Names) -> case pick_name(Names) of {ok, Name} -> gleam@dict:insert(Acc, Parameter, Name); {error, _} -> Acc end end ). -file("src/squirrel/internal/query.gleam", 1217). ?DOC(false). -spec infer_parameter_names( untyped_query(), list(squirrel@internal@gleam:type()) ) -> list(parameter()). infer_parameter_names(Query, Params) -> Names = parameter_names(erlang:element(6, Query)), gleam@list:index_map( Params, fun(Type_, I) -> case gleam_stdlib:map_get(Names, I + 1) of {ok, Name} -> {parameter, {some, Name}, Type_}; {error, _} -> {parameter, none, Type_} end end ). -file("src/squirrel/internal/query.gleam", 69). ?DOC(false). -spec add_types( untyped_query(), list(squirrel@internal@gleam:type()), list(squirrel@internal@gleam:field()) ) -> {ok, typed_query()} | {error, squirrel@internal@error:error()}. add_types(Query, Params, Returns) -> {untyped_query, File, Starting_line, Name, Comment, Content} = Query, Params@1 = infer_parameter_names(Query, Params), case duplicate_names(Returns) of [] -> {ok, {typed_query, File, Starting_line, Name, Comment, Content, Params@1, Returns}}; Names -> {error, {query_returns_multiple_values_with_the_same_name, File, Content, Starting_line, Names}} end. -file("src/squirrel/internal/query.gleam", 153). ?DOC(false). -spec do_take_comment(binary(), list(binary())) -> list(binary()). do_take_comment(Query, Lines) -> case gleam@string:trim_start(Query) of <<"--"/utf8, Rest/binary>> -> case gleam@string:split_once(Rest, <<"\n"/utf8>>) of {ok, {Line, Rest@1}} -> do_take_comment(Rest@1, [gleam@string:trim(Line) | Lines]); _ -> do_take_comment( <<""/utf8>>, [gleam@string:trim(Rest) | Lines] ) end; _ -> lists:reverse(Lines) end. -file("src/squirrel/internal/query.gleam", 149). ?DOC(false). -spec take_comment(binary()) -> list(binary()). take_comment(Query) -> do_take_comment(Query, []). -file("src/squirrel/internal/query.gleam", 117). ?DOC(false). -spec from_file(binary()) -> {ok, untyped_query()} | {error, squirrel@internal@error:error()}. from_file(File) -> Read_file = begin _pipe = simplifile:read(File), gleam@result:map_error( _pipe, fun(_capture) -> {cannot_read_file, File, _capture} end ) end, gleam@result:'try'( Read_file, fun(Content) -> File_name = begin _pipe@1 = filepath:base_name(File), filepath:strip_extension(_pipe@1) end, Name = begin _pipe@2 = squirrel@internal@gleam:value_identifier(File_name), gleam@result:map_error( _pipe@2, fun(_capture@1) -> {query_file_has_invalid_name, File, begin _pipe@3 = squirrel@internal@gleam:similar_value_identifier_string( File_name ), gleam@option:from_result(_pipe@3) end, _capture@1} end ) end, gleam@result:'try'( Name, fun(Name@1) -> {ok, {untyped_query, File, 1, Name@1, take_comment(Content), Content}} end ) end ). -file("src/squirrel/internal/query.gleam", 203). ?DOC(false). -spec merge_helpers(required_helpers(), required_helpers()) -> required_helpers(). merge_helpers(One, Other) -> case {One, Other} of {no_helpers, Other@1} -> Other@1; {Other@1, no_helpers} -> Other@1; {needs_encoder_and_decoder, _} -> needs_encoder_and_decoder; {_, needs_encoder_and_decoder} -> needs_encoder_and_decoder; {needs_decoder, needs_encoder} -> needs_encoder_and_decoder; {needs_encoder, needs_decoder} -> needs_encoder_and_decoder; {needs_encoder, needs_encoder} -> needs_encoder; {needs_decoder, needs_decoder} -> needs_decoder end. -file("src/squirrel/internal/query.gleam", 1147). ?DOC(false). -spec import_module(code_gen_state(), binary()) -> code_gen_state(). import_module(State, Name) -> Imports = case gleam@dict:has_key(erlang:element(2, State), Name) of false -> gleam@dict:insert(erlang:element(2, State), Name, gleam@set:new()); true -> erlang:element(2, State) end, {code_gen_state, Imports, erlang:element(3, State), erlang:element(4, State)}. -file("src/squirrel/internal/query.gleam", 218). ?DOC(false). -spec default_codegen_state() -> code_gen_state(). default_codegen_state() -> _pipe = {code_gen_state, maps:new(), false, maps:new()}, _pipe@1 = import_module(_pipe, <<"gleam/dynamic/decode"/utf8>>), import_module(_pipe@1, <<"pog"/utf8>>). -file("src/squirrel/internal/query.gleam", 266). ?DOC(false). -spec enum_decoder_name(squirrel@internal@gleam:type_identifier()) -> binary(). enum_decoder_name(Enum_name) -> _pipe = squirrel@internal@gleam:type_identifier_to_value_identifier( Enum_name ), _pipe@1 = squirrel@internal@gleam:value_identifier_to_string(_pipe), gleam@string:append(_pipe@1, <<"_decoder"/utf8>>). -file("src/squirrel/internal/query.gleam", 1171). ?DOC(false). -spec add_enum_helpers( code_gen_state(), binary(), squirrel@internal@gleam:type_identifier(), non_empty_list:non_empty_list(squirrel@internal@gleam:enum_variant()), required_helpers() ) -> code_gen_state(). add_enum_helpers(State, Original_name, Name, Variants, Required_helpers) -> {code_gen_state, erlang:element(2, State), erlang:element(3, State), begin gleam@dict:upsert( erlang:element(4, State), Name, fun(Value) -> case Value of none -> {enum_code_gen_data, Required_helpers, Original_name, Variants}; {some, {enum_code_gen_data, Helpers, _, _} = Data} -> Required_helpers@1 = merge_helpers( Required_helpers, Helpers ), {enum_code_gen_data, Required_helpers@1, erlang:element(3, Data), erlang:element(4, Data)} end end ) end}. -file("src/squirrel/internal/query.gleam", 1120). ?DOC(false). -spec comma_list(binary(), list(glam@doc:document()), binary()) -> glam@doc:document(). comma_list(Open, Content, Close) -> case Content of [] -> glam@doc:from_string(<>); _ -> _pipe@2 = [glam@doc:from_string(Open), begin _pipe = [{break, <<""/utf8>>, <<""/utf8>>}, glam@doc:join( Content, glam@doc:break(<<", "/utf8>>, <<","/utf8>>) )], _pipe@1 = glam@doc:concat(_pipe), glam@doc:nest(_pipe@1, 2) end, glam@doc:break(<<""/utf8>>, <<","/utf8>>), glam@doc:from_string(Close)], glam@doc:concat(_pipe@2) end. -file("src/squirrel/internal/query.gleam", 982). ?DOC(false). -spec call_doc(binary(), list(glam@doc:document())) -> glam@doc:document(). call_doc(Function, Args) -> _pipe@1 = [glam@doc:from_string(Function), begin _pipe = comma_list(<<"("/utf8>>, Args, <<")"/utf8>>), glam@doc:group(_pipe) end], _pipe@2 = glam@doc:concat(_pipe@1), glam@doc:group(_pipe@2). -file("src/squirrel/internal/query.gleam", 228). ?DOC(false). -spec gleam_type_to_decoder(code_gen_state(), squirrel@internal@gleam:type()) -> {code_gen_state(), glam@doc:document()}. gleam_type_to_decoder(State, Type_) -> case Type_ of uuid -> State@1 = begin _pipe = {code_gen_state, erlang:element(2, State), true, erlang:element(4, State)}, import_module(_pipe, <<"youid/uuid"/utf8>>) end, {State@1, glam@doc:from_string(<<"uuid_decoder()"/utf8>>)}; {list, Type_@1} -> {State@2, Inner_decoder} = gleam_type_to_decoder(State, Type_@1), {State@2, call_doc(<<"decode.list"/utf8>>, [Inner_decoder])}; {option, Type_@2} -> {State@3, Inner_decoder@1} = gleam_type_to_decoder(State, Type_@2), {State@3, call_doc(<<"decode.optional"/utf8>>, [Inner_decoder@1])}; date -> {State, glam@doc:from_string(<<"pog.calendar_date_decoder()"/utf8>>)}; time_of_day -> {State, glam@doc:from_string( <<"pog.calendar_time_of_day_decoder()"/utf8>> )}; timestamp -> {State, glam@doc:from_string(<<"pog.timestamp_decoder()"/utf8>>)}; int -> {State, glam@doc:from_string(<<"decode.int"/utf8>>)}; float -> {State, glam@doc:from_string(<<"decode.float"/utf8>>)}; numeric -> {State, glam@doc:from_string(<<"pog.numeric_decoder()"/utf8>>)}; bool -> {State, glam@doc:from_string(<<"decode.bool"/utf8>>)}; string -> {State, glam@doc:from_string(<<"decode.string"/utf8>>)}; bit_array -> {State, glam@doc:from_string(<<"decode.bit_array"/utf8>>)}; json -> {State, glam@doc:from_string(<<"decode.string"/utf8>>)}; {enum, Original_name, Enum_name, Variants} -> {add_enum_helpers( State, Original_name, Enum_name, Variants, needs_decoder ), glam@doc:from_string( <<(enum_decoder_name(Enum_name))/binary, "()"/utf8>> )} end. -file("src/squirrel/internal/query.gleam", 316). ?DOC(false). -spec enum_encoder_name(squirrel@internal@gleam:type_identifier()) -> binary(). enum_encoder_name(Enum_name) -> _pipe = squirrel@internal@gleam:type_identifier_to_value_identifier( Enum_name ), _pipe@1 = squirrel@internal@gleam:value_identifier_to_string(_pipe), gleam@string:append(_pipe@1, <<"_encoder"/utf8>>). -file("src/squirrel/internal/query.gleam", 1079). ?DOC(false). -spec fn_doc(list(binary()), glam@doc:document()) -> glam@doc:document(). fn_doc(Args, Body) -> _pipe@3 = [glam@doc:from_string(<<"fn"/utf8>>), begin _pipe = comma_list( <<"("/utf8>>, gleam@list:map(Args, fun glam@doc:from_string/1), <<") {"/utf8>> ), glam@doc:group(_pipe) end, begin _pipe@1 = [{break, <<" "/utf8>>, <<""/utf8>>}, Body], _pipe@2 = glam@doc:concat(_pipe@1), glam@doc:nest(_pipe@2, 2) end, {break, <<" "/utf8>>, <<""/utf8>>}, glam@doc:from_string(<<"}"/utf8>>)], _pipe@4 = glam@doc:concat(_pipe@3), glam@doc:group(_pipe@4). -file("src/squirrel/internal/query.gleam", 272). ?DOC(false). -spec gleam_type_to_encoder( code_gen_state(), squirrel@internal@gleam:type(), binary() ) -> {code_gen_state(), glam@doc:document()}. gleam_type_to_encoder(State, Type_, Name) -> Name@1 = glam@doc:from_string(Name), case Type_ of {list, Type_@1} -> {State@1, Inner_encoder} = gleam_type_to_encoder( State, Type_@1, <<"value"/utf8>> ), Map_fn = fn_doc([<<"value"/utf8>>], Inner_encoder), Doc = call_doc(<<"pog.array"/utf8>>, [Map_fn, Name@1]), {State@1, Doc}; {option, Type_@2} -> {State@2, Inner_encoder@1} = gleam_type_to_encoder( State, Type_@2, <<"value"/utf8>> ), Doc@1 = call_doc( <<"pog.nullable"/utf8>>, [fn_doc([<<"value"/utf8>>], Inner_encoder@1), Name@1] ), {State@2, Doc@1}; uuid -> State@3 = begin _pipe = State, import_module(_pipe, <<"youid/uuid"/utf8>>) end, Doc@2 = call_doc( <<"pog.text"/utf8>>, [call_doc(<<"uuid.to_string"/utf8>>, [Name@1])] ), {State@3, Doc@2}; json -> State@4 = begin _pipe@1 = State, import_module(_pipe@1, <<"gleam/json"/utf8>>) end, Doc@3 = call_doc( <<"pog.text"/utf8>>, [call_doc(<<"json.to_string"/utf8>>, [Name@1])] ), {State@4, Doc@3}; date -> {State, call_doc(<<"pog.calendar_date"/utf8>>, [Name@1])}; time_of_day -> {State, call_doc(<<"pog.calendar_time_of_day"/utf8>>, [Name@1])}; timestamp -> {State, call_doc(<<"pog.timestamp"/utf8>>, [Name@1])}; int -> {State, call_doc(<<"pog.int"/utf8>>, [Name@1])}; float -> {State, call_doc(<<"pog.float"/utf8>>, [Name@1])}; numeric -> {State, call_doc(<<"pog.float"/utf8>>, [Name@1])}; bool -> {State, call_doc(<<"pog.bool"/utf8>>, [Name@1])}; string -> {State, call_doc(<<"pog.text"/utf8>>, [Name@1])}; bit_array -> {State, call_doc(<<"pog.bytea"/utf8>>, [Name@1])}; {enum, Original_name, Enum_name, Variants} -> {add_enum_helpers( State, Original_name, Enum_name, Variants, needs_encoder ), call_doc(enum_encoder_name(Enum_name), [Name@1])} end. -file("src/squirrel/internal/query.gleam", 1155). ?DOC(false). -spec import_qualified(code_gen_state(), binary(), binary()) -> code_gen_state(). import_qualified(State, Module, Imported) -> Imports = gleam@dict:upsert( erlang:element(2, State), Module, fun(Imported_values) -> case Imported_values of {some, Imported_values@1} -> gleam@set:insert(Imported_values@1, Imported); none -> gleam@set:from_list([Imported]) end end ), {code_gen_state, Imports, erlang:element(3, State), erlang:element(4, State)}. -file("src/squirrel/internal/query.gleam", 327). ?DOC(false). -spec gleam_type_to_field_type( code_gen_state(), squirrel@internal@gleam:type(), type_position() ) -> {code_gen_state(), glam@doc:document()}. gleam_type_to_field_type(State, Type_, Position) -> case Type_ of {list, Type_@1} -> {State@1, Inner_type} = gleam_type_to_field_type( State, Type_@1, Position ), {State@1, call_doc(<<"List"/utf8>>, [Inner_type])}; {option, Type_@2} -> State@2 = begin _pipe = State, import_qualified( _pipe, <<"gleam/option"/utf8>>, <<"type Option"/utf8>> ) end, {State@3, Inner_type@1} = gleam_type_to_field_type( State@2, Type_@2, Position ), {State@3, call_doc(<<"Option"/utf8>>, [Inner_type@1])}; uuid -> {begin _pipe@1 = State, import_qualified( _pipe@1, <<"youid/uuid"/utf8>>, <<"type Uuid"/utf8>> ) end, glam@doc:from_string(<<"Uuid"/utf8>>)}; date -> State@4 = begin _pipe@2 = State, import_qualified( _pipe@2, <<"gleam/time/calendar"/utf8>>, <<"type Date"/utf8>> ) end, {State@4, glam@doc:from_string(<<"Date"/utf8>>)}; time_of_day -> State@5 = begin _pipe@3 = State, import_qualified( _pipe@3, <<"gleam/time/calendar"/utf8>>, <<"type TimeOfDay"/utf8>> ) end, {State@5, glam@doc:from_string(<<"TimeOfDay"/utf8>>)}; timestamp -> State@6 = begin _pipe@4 = State, import_qualified( _pipe@4, <<"gleam/time/timestamp"/utf8>>, <<"type Timestamp"/utf8>> ) end, {State@6, glam@doc:from_string(<<"Timestamp"/utf8>>)}; int -> {State, glam@doc:from_string(<<"Int"/utf8>>)}; float -> {State, glam@doc:from_string(<<"Float"/utf8>>)}; numeric -> {State, glam@doc:from_string(<<"Float"/utf8>>)}; bool -> {State, glam@doc:from_string(<<"Bool"/utf8>>)}; string -> {State, glam@doc:from_string(<<"String"/utf8>>)}; json -> case Position of enum_field -> {State, glam@doc:from_string(<<"String"/utf8>>)}; function_argument -> State@7 = begin _pipe@5 = State, import_qualified( _pipe@5, <<"gleam/json"/utf8>>, <<"type Json"/utf8>> ) end, {State@7, glam@doc:from_string(<<"Json"/utf8>>)} end; bit_array -> {State, glam@doc:from_string(<<"BitArray"/utf8>>)}; {enum, Original_name, Name, Variants} -> {add_enum_helpers(State, Original_name, Name, Variants, no_helpers), begin _pipe@6 = squirrel@internal@gleam:type_identifier_to_string( Name ), glam@doc:from_string(_pipe@6) end} end. -file("src/squirrel/internal/query.gleam", 661). ?DOC(false). -spec module_doc(binary(), binary()) -> binary(). module_doc(Version, Directory) -> <<<<<<<<"//// This module contains the code to run the sql queries defined in //// `"/utf8, Directory/binary>>/binary, "`. //// > 🐿️ This module was generated automatically using "/utf8>>/binary, Version/binary>>/binary, " of //// > the [squirrel package](https://github.com/giacomocavalieri/squirrel). ////"/utf8>>. -file("src/squirrel/internal/query.gleam", 459). ?DOC(false). -spec separator_comment(binary()) -> glam@doc:document(). separator_comment(Value) -> _pipe = gleam@string:pad_end( <<<<"// --- "/utf8, Value/binary>>/binary, " "/utf8>>, 80, <<"-"/utf8>> ), glam@doc:from_string(_pipe). -file("src/squirrel/internal/query.gleam", 1031). ?DOC(false). -spec block(list(glam@doc:document())) -> glam@doc:document(). block(Body) -> _pipe@3 = [glam@doc:from_string(<<"{"/utf8>>), begin _pipe = {line, 1}, glam@doc:nest(_pipe, 2) end, begin _pipe@1 = Body, _pipe@2 = glam@doc:join(_pipe@1, {line, 1}), glam@doc:nest(_pipe@2, 2) end, {line, 1}, glam@doc:from_string(<<"}"/utf8>>)], glam@doc:concat(_pipe@3). -file("src/squirrel/internal/query.gleam", 792). ?DOC(false). -spec enum_type_definition_doc( binary(), squirrel@internal@gleam:type_identifier(), binary(), non_empty_list:non_empty_list(squirrel@internal@gleam:enum_variant()) ) -> glam@doc:document(). enum_type_definition_doc(Version, Enum_name, Original_name, Variants) -> String_enum_name = squirrel@internal@gleam:type_identifier_to_string( Enum_name ), Variants@1 = non_empty_list:map( Variants, fun(Variant) -> _pipe = squirrel@internal@gleam:type_identifier_to_string( erlang:element(2, Variant) ), glam@doc:from_string(_pipe) end ), Enum_doc = <<<<<<<<"/// Corresponds to the Postgres `"/utf8, Original_name/binary>>/binary, "` enum. /// /// > 🐿️ This type definition was generated automatically using "/utf8>>/binary, Version/binary>>/binary, " of the /// > [squirrel package](https://github.com/giacomocavalieri/squirrel). ///"/utf8>>, glam@doc:concat( [glam@doc:from_string(Enum_doc), {line, 1}, glam@doc:from_string( <<<<"pub type "/utf8, String_enum_name/binary>>/binary, " "/utf8>> ), block(non_empty_list:to_list(Variants@1))] ). -file("src/squirrel/internal/query.gleam", 1051). ?DOC(false). -spec fun_doc( publicity(), binary(), list(glam@doc:document()), glam@doc:document(), list(glam@doc:document()) ) -> glam@doc:document(). fun_doc(Publicity, Name, Args, Return_type, Body) -> Publicity@1 = case Publicity of private -> <<""/utf8>>; public -> <<"pub "/utf8>> end, _pipe@2 = [begin _pipe = [glam@doc:from_string( <<<>/binary, Name/binary>> ), comma_list(<<"("/utf8>>, Args, <<")"/utf8>>), glam@doc:from_string(<<" -> "/utf8>>), Return_type, glam@doc:from_string(<<" "/utf8>>)], _pipe@1 = glam@doc:concat(_pipe), glam@doc:group(_pipe@1) end, block(Body)], _pipe@3 = glam@doc:concat(_pipe@2), glam@doc:group(_pipe@3). -file("src/squirrel/internal/query.gleam", 966). ?DOC(false). -spec pipe_call_doc(binary(), glam@doc:document(), list(glam@doc:document())) -> glam@doc:document(). pipe_call_doc(Function, First, Rest) -> Function@1 = case Rest of [] -> glam@doc:from_string(<<"|> "/utf8, Function/binary>>); [_ | _] -> call_doc(<<"|> "/utf8, Function/binary>>, Rest) end, _pipe = [First, {line, 1}, Function@1], glam@doc:concat(_pipe). -file("src/squirrel/internal/query.gleam", 1107). ?DOC(false). -spec string_doc(binary()) -> glam@doc:document(). string_doc(Content) -> Escaped_string = begin _pipe = Content, _pipe@1 = gleam@string:replace(_pipe, <<"\\"/utf8>>, <<"\\\\"/utf8>>), _pipe@2 = gleam@string:replace(_pipe@1, <<"\""/utf8>>, <<"\\\""/utf8>>), glam@doc:from_string(_pipe@2) end, _pipe@3 = [glam@doc:from_string(<<"\""/utf8>>), Escaped_string, glam@doc:from_string(<<"\""/utf8>>)], glam@doc:concat(_pipe@3). -file("src/squirrel/internal/query.gleam", 820). ?DOC(false). -spec enum_encoder_doc( squirrel@internal@gleam:type_identifier(), non_empty_list:non_empty_list(squirrel@internal@gleam:enum_variant()) ) -> glam@doc:document(). enum_encoder_doc(Name, Variants) -> Case_lines = begin non_empty_list:map( Variants, fun(Variant) -> _pipe = [glam@doc:from_string( squirrel@internal@gleam:type_identifier_to_string( erlang:element(2, Variant) ) ), glam@doc:from_string(<<" -> "/utf8>>), string_doc(erlang:element(3, Variant))], glam@doc:concat(_pipe) end ) end, Var_name = begin _pipe@1 = Name, _pipe@2 = squirrel@internal@gleam:type_identifier_to_value_identifier( _pipe@1 ), squirrel@internal@gleam:value_identifier_to_string(_pipe@2) end, Case_ = glam@doc:concat( [glam@doc:from_string( <<<<"case "/utf8, Var_name/binary>>/binary, " "/utf8>> ), block(non_empty_list:to_list(Case_lines))] ), Case_@1 = pipe_call_doc(<<"pog.text"/utf8>>, Case_, []), fun_doc( private, enum_encoder_name(Name), [glam@doc:from_string(Var_name)], glam@doc:from_string(<<"pog.Value"/utf8>>), [Case_@1] ). -file("src/squirrel/internal/query.gleam", 856). ?DOC(false). -spec enum_decoder_doc( squirrel@internal@gleam:type_identifier(), non_empty_list:non_empty_list(squirrel@internal@gleam:enum_variant()) ) -> glam@doc:document(). enum_decoder_doc(Name, Variants) -> Success_case_lines = begin non_empty_list:map( Variants, fun(Variant) -> glam@doc:concat( [string_doc(erlang:element(3, Variant)), glam@doc:from_string(<<" -> "/utf8>>), call_doc( <<"decode.success"/utf8>>, [begin _pipe = squirrel@internal@gleam:type_identifier_to_string( erlang:element(2, Variant) ), glam@doc:from_string(_pipe) end] )] ) end ) end, Failure_case_line = begin _pipe@1 = [glam@doc:from_string(<<"_ -> "/utf8>>), call_doc( <<"decode.failure"/utf8>>, [glam@doc:from_string( squirrel@internal@gleam:type_identifier_to_string( erlang:element(2, erlang:element(2, Variants)) ) ), string_doc( squirrel@internal@gleam:type_identifier_to_string(Name) )] )], glam@doc:concat(_pipe@1) end, Var_name = begin _pipe@2 = Name, _pipe@3 = squirrel@internal@gleam:type_identifier_to_value_identifier( _pipe@2 ), squirrel@internal@gleam:value_identifier_to_string(_pipe@3) end, Case_ = glam@doc:concat( [glam@doc:from_string( <<<<"case "/utf8, Var_name/binary>>/binary, " "/utf8>> ), begin _pipe@4 = Success_case_lines, _pipe@5 = non_empty_list:to_list(_pipe@4), _pipe@6 = lists:append(_pipe@5, [Failure_case_line]), block(_pipe@6) end] ), Enum_decoder_type = glam@doc:from_string( <<<<"decode.Decoder("/utf8, (squirrel@internal@gleam:type_identifier_to_string(Name))/binary>>/binary, ")"/utf8>> ), fun_doc( private, enum_decoder_name(Name), [], Enum_decoder_type, [glam@doc:from_string( <<<<"use "/utf8, Var_name/binary>>/binary, " <- decode.then(decode.string)"/utf8>> ), Case_] ). -file("src/squirrel/internal/query.gleam", 764). ?DOC(false). -spec enum_doc( binary(), squirrel@internal@gleam:type_identifier(), enum_code_gen_data() ) -> glam@doc:document(). enum_doc(Version, Enum_name, Enum_data) -> {enum_code_gen_data, Required_helpers, Original_name, Variants} = Enum_data, _pipe = case Required_helpers of needs_decoder -> [enum_type_definition_doc( Version, Enum_name, Original_name, Variants ), enum_decoder_doc(Enum_name, Variants)]; needs_encoder -> [enum_type_definition_doc( Version, Enum_name, Original_name, Variants ), enum_encoder_doc(Enum_name, Variants)]; needs_encoder_and_decoder -> [enum_type_definition_doc( Version, Enum_name, Original_name, Variants ), enum_decoder_doc(Enum_name, Variants), enum_encoder_doc(Enum_name, Variants)]; no_helpers -> [enum_type_definition_doc( Version, Enum_name, Original_name, Variants )] end, glam@doc:join(_pipe, glam@doc:lines(2)). -file("src/squirrel/internal/query.gleam", 750). ?DOC(false). -spec enums_doc( binary(), gleam@dict:dict(squirrel@internal@gleam:type_identifier(), enum_code_gen_data()) ) -> glam@doc:document(). enums_doc(Version, Enums) -> _pipe = gleam@dict:fold( Enums, [], fun(Docs, Name, Enum_data) -> [enum_doc(Version, Name, Enum_data) | Docs] end ), _pipe@1 = lists:reverse(_pipe), glam@doc:join(_pipe@1, glam@doc:lines(2)). -file("src/squirrel/internal/query.gleam", 464). ?DOC(false). -spec imports_doc(gleam@dict:dict(binary(), gleam@set:set(binary()))) -> glam@doc:document(). imports_doc(Imports) -> Sorted_imports = begin _pipe = maps:to_list(Imports), gleam@list:sort( _pipe, fun(One, Other) -> gleam@string:compare( erlang:element(1, One), erlang:element(1, Other) ) end ) end, _pipe@9 = begin gleam@list:map( Sorted_imports, fun(_use0) -> {Module, Imported_values} = _use0, Import_line = glam@doc:from_string( <<"import "/utf8, Module/binary>> ), gleam@bool:guard( gleam@set:is_empty(Imported_values), Import_line, fun() -> Imported_values@1 = begin _pipe@1 = gleam@set:to_list(Imported_values), _pipe@2 = gleam@list:sort( _pipe@1, fun gleam@string:compare/2 ), _pipe@3 = gleam@list:map( _pipe@2, fun glam@doc:from_string/1 ), _pipe@4 = glam@doc:join( _pipe@3, glam@doc:break(<<", "/utf8>>, <<","/utf8>>) ), glam@doc:group(_pipe@4) end, _pipe@8 = [Import_line, glam@doc:from_string(<<".{"/utf8>>), begin _pipe@5 = [{break, <<""/utf8>>, <<""/utf8>>}, Imported_values@1], _pipe@6 = glam@doc:concat(_pipe@5), _pipe@7 = glam@doc:group(_pipe@6), glam@doc:nest(_pipe@7, 2) end, {break, <<""/utf8>>, <<""/utf8>>}, glam@doc:from_string(<<"}"/utf8>>)], glam@doc:concat(_pipe@8) end ) end ) end, glam@doc:join(_pipe@9, {line, 1}). -file("src/squirrel/internal/query.gleam", 656). ?DOC(false). -spec pipe_all_encoders(glam@doc:document(), list(glam@doc:document())) -> glam@doc:document(). pipe_all_encoders(Doc, Decoders) -> gleam@list:fold(Decoders, Doc, fun(Doc@1, Decoder) -> _pipe = Doc@1, pipe_call_doc(<<"pog.parameter"/utf8>>, _pipe, [Decoder]) end). -file("src/squirrel/internal/query.gleam", 1096). ?DOC(false). -spec let_var(binary(), glam@doc:document()) -> glam@doc:document(). let_var(Name, Body) -> _pipe = [glam@doc:from_string( <<<<"let "/utf8, Name/binary>>/binary, " ="/utf8>> ), {break, <<" "/utf8>>, <<""/utf8>>}, Body], _pipe@1 = glam@doc:concat(_pipe), glam@doc:group(_pipe@1). -file("src/squirrel/internal/query.gleam", 669). ?DOC(false). -spec function_doc(binary(), typed_query()) -> binary(). function_doc(Version, Query) -> {typed_query, File, _, Name, Comment, _, _, _} = Query, Function_name = squirrel@internal@gleam:value_identifier_to_string(Name), Base = case Comment of [] -> <<<<<<<<"/// Runs the `"/utf8, Function_name/binary>>/binary, "` query /// defined in `"/utf8>>/binary, File/binary>>/binary, "`."/utf8>>; [_ | _] -> _pipe = gleam@list:map( Comment, fun(Comment_line) -> gleam@string:trim_end(<<"/// "/utf8, Comment_line/binary>>) end ), gleam@string:join(_pipe, <<"\n"/utf8>>) end, <<<<< 🐿️ This function was generated automatically using "/utf8>>/binary, Version/binary>>/binary, " of /// > the [squirrel package](https://github.com/giacomocavalieri/squirrel). ///"/utf8>>. -file("src/squirrel/internal/query.gleam", 609). ?DOC(false). -spec rename_to_avoid_reserved_keywords(binary()) -> binary(). rename_to_avoid_reserved_keywords(String) -> case String of <<"as"/utf8>> -> <>; <<"assert"/utf8>> -> <>; <<"auto"/utf8>> -> <>; <<"case"/utf8>> -> <>; <<"const"/utf8>> -> <>; <<"delegate"/utf8>> -> <>; <<"derive"/utf8>> -> <>; <<"echo"/utf8>> -> <>; <<"else"/utf8>> -> <>; <<"fn"/utf8>> -> <>; <<"if"/utf8>> -> <>; <<"implement"/utf8>> -> <>; <<"import"/utf8>> -> <>; <<"let"/utf8>> -> <>; <<"macro"/utf8>> -> <>; <<"opaque"/utf8>> -> <>; <<"panic"/utf8>> -> <>; <<"pub"/utf8>> -> <>; <<"test"/utf8>> -> <>; <<"todo"/utf8>> -> <>; <<"type"/utf8>> -> <>; <<"use"/utf8>> -> <>; _ -> String end. -file("src/squirrel/internal/query.gleam", 644). ?DOC(false). -spec rename_to_avoid_shadowing_loop( gleam@set:set(binary()), binary(), integer() ) -> binary(). rename_to_avoid_shadowing_loop(Used_names, Name, Tries) -> Candidate = <<<>/binary, (erlang:integer_to_binary(Tries))/binary>>, case gleam@set:contains(Used_names, Candidate) of false -> Candidate; true -> rename_to_avoid_shadowing_loop(Used_names, Name, Tries + 1) end. -file("src/squirrel/internal/query.gleam", 637). ?DOC(false). -spec rename_to_avoid_shadowing(gleam@set:set(binary()), binary()) -> binary(). rename_to_avoid_shadowing(Used_names, Name) -> case gleam@set:contains(Used_names, Name) of false -> Name; true -> rename_to_avoid_shadowing_loop(Used_names, Name, 1) end. -file("src/squirrel/internal/query.gleam", 570). ?DOC(false). -spec generate_argument_name(gleam@set:set(binary()), parameter(), integer()) -> binary(). generate_argument_name(Used_names, Param, Position) -> Name@1 = case erlang:element(2, Param) of {some, Name} -> squirrel@internal@gleam:value_identifier_to_string(Name); none -> <<"arg_"/utf8, (erlang:integer_to_binary(Position + 1))/binary>> end, Name@2 = case gleam_stdlib:string_ends_with(Name@1, <<"encoder"/utf8>>) orelse gleam_stdlib:string_ends_with(Name@1, <<"decoder"/utf8>>) of true -> rename_to_avoid_shadowing_loop(Used_names, Name@1, 1); false -> Name@1 end, Name@3 = case Name@2 of <<"true"/utf8>> -> <<"arg_"/utf8, (erlang:integer_to_binary(Position + 1))/binary>>; <<"false"/utf8>> -> <<"arg_"/utf8, (erlang:integer_to_binary(Position + 1))/binary>>; <<"null"/utf8>> -> <<"arg_"/utf8, (erlang:integer_to_binary(Position + 1))/binary>>; _ -> Name@2 end, _pipe = rename_to_avoid_shadowing(Used_names, Name@3), rename_to_avoid_reserved_keywords(_pipe). -file("src/squirrel/internal/query.gleam", 1010). ?DOC(false). -spec nested_calls_doc(binary(), binary(), list(glam@doc:document())) -> glam@doc:document(). nested_calls_doc(First, Second, Arguments) -> _pipe = [glam@doc:from_string(First), glam@doc:from_string(<<"("/utf8>>), call_doc(Second, Arguments), glam@doc:from_string(<<")"/utf8>>)], glam@doc:concat(_pipe). -file("src/squirrel/internal/query.gleam", 927). ?DOC(false). -spec decoder_doc( code_gen_state(), binary(), list(squirrel@internal@gleam:field()) ) -> {code_gen_state(), glam@doc:document()}. decoder_doc(State, Constructor, Returns) -> Fallback = {State, glam@doc:from_string( <<"decode.map(decode.dynamic, fn(_) { Nil })"/utf8>> )}, gleam@bool:guard( Returns =:= [], Fallback, fun() -> {State@3, Parameters@2, Labelled_names@2} = begin gleam@list:index_fold( Returns, {State, [], []}, fun(Acc, Field, I) -> {State@1, Parameters, Labelled_names} = Acc, Label = begin _pipe = squirrel@internal@gleam:value_identifier_to_string( erlang:element(2, Field) ), rename_to_avoid_reserved_keywords(_pipe) end, Labelled_names@1 = [glam@doc:from_string( <