-module(sqlode@internal@codegen@common). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/sqlode/internal/codegen/common.gleam"). -export([has_slices/1, queries_have_slices/1, render_enum_or_set_decoder/2, qualified_field_type/2, queries_have_enum_params/1, queries_have_enums/1, custom_type_imports/1, result_scalar_types/1, param_scalar_types/1, catalog_scalar_types/1, escape_string/1, out_to_module_path/1, runtime_import_path/1, gleam_type/2, gleam_fn/4]). -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). -file("src/sqlode/internal/codegen/common.gleam", 9). ?DOC(false). -spec has_slices(list(sqlode@internal@model:query_param())) -> boolean(). has_slices(Params) -> gleam@list:any(Params, fun(P) -> erlang:element(6, P) end). -file("src/sqlode/internal/codegen/common.gleam", 13). ?DOC(false). -spec queries_have_slices(list(sqlode@internal@model:analyzed_query())) -> boolean(). queries_have_slices(Queries) -> gleam@list:any( Queries, fun(Query) -> has_slices(erlang:element(3, Query)) end ). -file("src/sqlode/internal/codegen/common.gleam", 23). ?DOC(false). -spec render_enum_or_set_decoder( sqlode@internal@model:scalar_type(), fun((sqlode@internal@model:scalar_type()) -> binary()) ) -> binary(). render_enum_or_set_decoder(Scalar_type, Fallback) -> case Scalar_type of {enum_type, Enum_name} -> <<<<<<<<<<<<"decode.then(decode.string, fn(s) { case models."/utf8, (sqlode@internal@type_mapping:enum_from_string_fn( Enum_name ))/binary>>/binary, "(s) { Ok(v) -> decode.success(v) Error(_) -> decode.failure(models."/utf8>>/binary, (sqlode@internal@type_mapping:enum_default_fn( Enum_name ))/binary>>/binary, "(), \"known "/utf8>>/binary, Enum_name/binary>>/binary, " variant, got '\" <> s <> \"'\") } })"/utf8>>; {set_type, Set_name} -> <<<<<<<<"decode.then(decode.string, fn(s) { case models."/utf8, (sqlode@internal@type_mapping:set_from_string_fn( Set_name ))/binary>>/binary, "(s) { Ok(v) -> decode.success(v) Error(_) -> decode.failure([], \"known "/utf8>>/binary, Set_name/binary>>/binary, " set value, got '\" <> s <> \"'\") } })"/utf8>>; _ -> Fallback(Scalar_type) end. -file("src/sqlode/internal/codegen/common.gleam", 91). ?DOC(false). -spec needs_models_prefix_for_rich_type( sqlode@internal@model:scalar_type(), sqlode@internal@model:type_mapping() ) -> boolean(). needs_models_prefix_for_rich_type(Scalar_type, Type_mapping_mode) -> case Type_mapping_mode of rich_mapping -> sqlode@internal@type_mapping:is_rich_type(Scalar_type); strong_mapping -> sqlode@internal@type_mapping:is_rich_type(Scalar_type); string_mapping -> false end. -file("src/sqlode/internal/codegen/common.gleam", 59). ?DOC(false). -spec qualified_field_type( sqlode@internal@model:scalar_type(), sqlode@internal@model:type_mapping() ) -> binary(). qualified_field_type(Scalar_type, Type_mapping_mode) -> case Scalar_type of {enum_type, _} -> <<"models."/utf8, (sqlode@internal@type_mapping:scalar_type_to_gleam_type( Scalar_type, Type_mapping_mode ))/binary>>; {set_type, Name} -> <<<<"List(models."/utf8, (sqlode@internal@type_mapping:set_value_type_name(Name))/binary>>/binary, ")"/utf8>>; {array_type, Element} -> <<<<"List("/utf8, (qualified_field_type(Element, Type_mapping_mode))/binary>>/binary, ")"/utf8>>; _ -> case needs_models_prefix_for_rich_type( Scalar_type, Type_mapping_mode ) of true -> <<"models."/utf8, (sqlode@internal@type_mapping:scalar_type_to_gleam_type( Scalar_type, Type_mapping_mode ))/binary>>; false -> sqlode@internal@type_mapping:scalar_type_to_gleam_type( Scalar_type, Type_mapping_mode ) end end. -file("src/sqlode/internal/codegen/common.gleam", 102). ?DOC(false). -spec queries_have_enum_params(list(sqlode@internal@model:analyzed_query())) -> boolean(). queries_have_enum_params(Queries) -> gleam@list:any( Queries, fun(Query) -> gleam@list:any( erlang:element(3, Query), fun(Param) -> case erlang:element(4, Param) of {enum_type, _} -> true; {set_type, _} -> true; _ -> false end end ) end ). -file("src/sqlode/internal/codegen/common.gleam", 113). ?DOC(false). -spec queries_have_enums(list(sqlode@internal@model:analyzed_query())) -> boolean(). queries_have_enums(Queries) -> gleam@list:any( Queries, fun(Query) -> gleam@list:any( erlang:element(3, Query), fun(Param) -> case erlang:element(4, Param) of {enum_type, _} -> true; {set_type, _} -> true; _ -> false end end ) orelse gleam@list:any( erlang:element(4, Query), fun(Col) -> case Col of {scalar_result, {result_column, _, {enum_type, _}, _, _}} -> true; {scalar_result, {result_column, _, {set_type, _}, _, _}} -> true; _ -> false end end ) end ). -file("src/sqlode/internal/codegen/common.gleam", 138). ?DOC(false). -spec custom_type_imports(list(sqlode@internal@model:scalar_type())) -> list(binary()). custom_type_imports(Scalar_types) -> _pipe = Scalar_types, _pipe@1 = gleam@list:filter_map(_pipe, fun(St) -> case St of {custom_type, Name, {some, Module}, _} -> {ok, <<<<<<<<"import "/utf8, Module/binary>>/binary, ".{type "/utf8>>/binary, Name/binary>>/binary, "}"/utf8>>}; _ -> {error, nil} end end), _pipe@2 = gleam@list:unique(_pipe@1), gleam@list:sort(_pipe@2, fun gleam@string:compare/2). -file("src/sqlode/internal/codegen/common.gleam", 152). ?DOC(false). -spec result_scalar_types(list(sqlode@internal@model:analyzed_query())) -> list(sqlode@internal@model:scalar_type()). result_scalar_types(Queries) -> gleam@list:flat_map( Queries, fun(Query) -> gleam@list:filter_map( erlang:element(4, Query), fun(Col) -> case Col of {scalar_result, {result_column, _, Scalar_type, _, _}} -> {ok, Scalar_type}; {embedded_result, {embedded_column, _, _, Columns}} -> case gleam@list:find_map( Columns, fun(C) -> case erlang:element(3, C) of {custom_type, _, _, _} -> {ok, erlang:element(3, C)}; _ -> {error, nil} end end ) of {ok, St} -> {ok, St}; {error, _} -> {error, nil} end end end ) end ). -file("src/sqlode/internal/codegen/common.gleam", 178). ?DOC(false). -spec param_scalar_types(list(sqlode@internal@model:analyzed_query())) -> list(sqlode@internal@model:scalar_type()). param_scalar_types(Queries) -> gleam@list:flat_map( Queries, fun(Query) -> gleam@list:map( erlang:element(3, Query), fun(P) -> erlang:element(4, P) end ) end ). -file("src/sqlode/internal/codegen/common.gleam", 187). ?DOC(false). -spec catalog_scalar_types(sqlode@internal@model:catalog()) -> list(sqlode@internal@model:scalar_type()). catalog_scalar_types(Catalog) -> gleam@list:flat_map( erlang:element(2, Catalog), fun(Table) -> gleam@list:map( erlang:element(3, Table), fun(Col) -> erlang:element(3, Col) end ) end ). -file("src/sqlode/internal/codegen/common.gleam", 193). ?DOC(false). -spec escape_string(binary()) -> binary(). escape_string(Input) -> _pipe = Input, _pipe@1 = gleam@string:replace(_pipe, <<"\\"/utf8>>, <<"\\\\"/utf8>>), _pipe@2 = gleam@string:replace(_pipe@1, <<"\""/utf8>>, <<"\\\""/utf8>>), _pipe@3 = gleam@string:replace(_pipe@2, <<"\n"/utf8>>, <<"\\n"/utf8>>), _pipe@4 = gleam@string:replace(_pipe@3, <<"\r"/utf8>>, <<"\\r"/utf8>>), gleam@string:replace(_pipe@4, <<"\t"/utf8>>, <<"\\t"/utf8>>). -file("src/sqlode/internal/codegen/common.gleam", 205). ?DOC(false). -spec out_to_module_path(binary()) -> binary(). out_to_module_path(Out) -> case gleam_stdlib:string_starts_with(Out, <<"src/"/utf8>>) of true -> gleam@string:drop_start(Out, 4); false -> _pipe = gleam@string:split(Out, <<"/src/"/utf8>>), _pipe@1 = gleam@list:last(_pipe), gleam@result:unwrap(_pipe@1, Out) end. -file("src/sqlode/internal/codegen/common.gleam", 220). ?DOC(false). -spec runtime_import_path(sqlode@internal@model:gleam_output()) -> binary(). runtime_import_path(Gleam) -> case erlang:element(8, Gleam) of true -> <<(out_to_module_path(erlang:element(2, Gleam)))/binary, "/runtime"/utf8>>; false -> <<"sqlode/runtime"/utf8>> end. -file("src/sqlode/internal/codegen/common.gleam", 233). ?DOC(false). -spec gleam_type(binary(), binary()) -> binary(). gleam_type(Name, Body) -> _pipe = sqlode@internal@codegen@builder:concat( [sqlode@internal@codegen@builder:line( <<<<"pub type "/utf8, Name/binary>>/binary, " {"/utf8>> ), sqlode@internal@codegen@builder:line( <<<<<<<<" "/utf8, Name/binary>>/binary, "("/utf8>>/binary, Body/binary>>/binary, ")"/utf8>> ), sqlode@internal@codegen@builder:line(<<"}"/utf8>>)] ), sqlode@internal@codegen@builder:render(_pipe). -file("src/sqlode/internal/codegen/common.gleam", 248). ?DOC(false). -spec gleam_fn(binary(), binary(), binary(), binary()) -> binary(). gleam_fn(Name, Params, Return_type, Body) -> _pipe = sqlode@internal@codegen@builder:concat( [sqlode@internal@codegen@builder:line( <<<<<<<<<<<<"pub fn "/utf8, Name/binary>>/binary, "("/utf8>>/binary, Params/binary>>/binary, ") -> "/utf8>>/binary, Return_type/binary>>/binary, " {"/utf8>> ), sqlode@internal@codegen@builder:line(<<" "/utf8, Body/binary>>), sqlode@internal@codegen@builder:line(<<"}"/utf8>>)] ), sqlode@internal@codegen@builder:render(_pipe).