-module(sqlode@codegen@queries). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/sqlode/codegen/queries.gleam"). -export([render/3]). -file("src/sqlode/codegen/queries.gleam", 78). -spec engine_placeholder_style_expr(sqlode@model:engine()) -> binary(). engine_placeholder_style_expr(Engine) -> case Engine of postgre_s_q_l -> <<"runtime.DollarNumbered"/utf8>>; my_s_q_l -> <<"runtime.QuestionPositional"/utf8>>; s_q_lite -> <<"runtime.QuestionNumbered"/utf8>> end. -file("src/sqlode/codegen/queries.gleam", 86). -spec render_query_function( sqlode@naming:naming_context(), sqlode@model:analyzed_query(), boolean(), binary() ) -> binary(). render_query_function(Naming_ctx, Query, Emit_sql_as_comment, Style_expr) -> Has_params = not gleam@list:is_empty(erlang:element(3, Query)), Comment = case Emit_sql_as_comment of true -> [<<"// SQL: "/utf8, (erlang:element(5, erlang:element(2, Query)))/binary>>]; false -> [] end, Return_type = case Has_params of true -> Params_type = <<(sqlode@naming:to_pascal_case( Naming_ctx, erlang:element(2, erlang:element(2, Query)) ))/binary, "Params"/utf8>>, <<<<"runtime.RawQuery(params."/utf8, Params_type/binary>>/binary, ")"/utf8>>; false -> <<"runtime.RawQuery(Nil)"/utf8>> end, Encode_line = case Has_params of true -> Values_fn = <<(erlang:element(3, erlang:element(2, Query)))/binary, "_values"/utf8>>, <<<<" encode: params."/utf8, Values_fn/binary>>/binary, ","/utf8>>; false -> <<" encode: fn(_) { [] },"/utf8>> end, Slice_params = gleam@list:filter( erlang:element(3, Query), fun(P) -> erlang:element(6, P) end ), Slice_info_line = case Slice_params of [] -> <<" slice_info: fn(_) { [] },"/utf8>>; _ -> Entries = begin _pipe = Slice_params, _pipe@1 = gleam@list:map( _pipe, fun(P@1) -> <<<<<<<<"#("/utf8, (erlang:integer_to_binary( erlang:element(2, P@1) ))/binary>>/binary, ", list.length(p."/utf8>>/binary, (erlang:element(3, P@1))/binary>>/binary, "))"/utf8>> end ), gleam@string:join(_pipe@1, <<", "/utf8>>) end, <<<<" slice_info: fn(p) { ["/utf8, Entries/binary>>/binary, "] },"/utf8>> end, gleam@string:join( lists:append( [Comment, [<<<<<<<<"pub fn "/utf8, (erlang:element(3, erlang:element(2, Query)))/binary>>/binary, "() -> "/utf8>>/binary, Return_type/binary>>/binary, " {"/utf8>>, <<" runtime.RawQuery("/utf8>>, <<<<" name: \""/utf8, (sqlode@codegen@common:escape_string( erlang:element(2, erlang:element(2, Query)) ))/binary>>/binary, "\","/utf8>>, <<<<" sql: \""/utf8, (sqlode@codegen@common:escape_string( erlang:element(5, erlang:element(2, Query)) ))/binary>>/binary, "\","/utf8>>, <<<<" command: runtime."/utf8, (sqlode@model:query_command_to_string( erlang:element(4, erlang:element(2, Query)) ))/binary>>/binary, ","/utf8>>, <<<<" param_count: "/utf8, (erlang:integer_to_binary( erlang:element(7, erlang:element(2, Query)) ))/binary>>/binary, ","/utf8>>, <<<<" placeholder_style: "/utf8, Style_expr/binary>>/binary, ","/utf8>>, Encode_line, Slice_info_line, <<" )"/utf8>>, <<"}"/utf8>>]] ), <<"\n"/utf8>> ). -file("src/sqlode/codegen/queries.gleam", 157). -spec render_query_info_literal(sqlode@model:parsed_query()) -> binary(). render_query_info_literal(Query) -> <<<<<<<<<<<<<<<<"runtime.QueryInfo(name: \""/utf8, (sqlode@codegen@common:escape_string( erlang:element(2, Query) ))/binary>>/binary, "\", sql: \""/utf8>>/binary, (sqlode@codegen@common:escape_string( erlang:element(5, Query) ))/binary>>/binary, "\", command: runtime."/utf8>>/binary, (sqlode@model:query_command_to_string( erlang:element(4, Query) ))/binary>>/binary, ", param_count: "/utf8>>/binary, (erlang:integer_to_binary(erlang:element(7, Query)))/binary>>/binary, ")"/utf8>>. -file("src/sqlode/codegen/queries.gleam", 8). -spec render( sqlode@naming:naming_context(), sqlode@model:sql_block(), list(sqlode@model:analyzed_query()) ) -> binary(). render(Naming_ctx, Block, Queries) -> {sql_block, _, Engine, _, _, Gleam, _} = Block, {gleam_output, Out, Runtime, _, _, _, _, _, _} = Gleam, Module_path = sqlode@codegen@common:out_to_module_path(Out), Emit_sql_as_comment = erlang:element(5, Gleam), Has_slices = sqlode@codegen@common:queries_have_slices(Queries), Style_expr = engine_placeholder_style_expr(Engine), Query_functions = begin _pipe = Queries, _pipe@1 = gleam@list:map( _pipe, fun(_capture) -> render_query_function( Naming_ctx, _capture, Emit_sql_as_comment, Style_expr ) end ), gleam@string:join(_pipe@1, <<"\n\n"/utf8>>) end, All_items = case Queries of [] -> <<"[]"/utf8>>; _ -> _pipe@2 = Queries, _pipe@3 = gleam@list:map( _pipe@2, fun(Query) -> render_query_info_literal(erlang:element(2, Query)) end ), _pipe@4 = gleam@string:join(_pipe@3, <<", "/utf8>>), (fun(Items) -> <<<<"["/utf8, Items/binary>>/binary, "]"/utf8>> end)( _pipe@4 ) end, Has_any_params = gleam@list:any( Queries, fun(Q) -> not gleam@list:is_empty(erlang:element(3, Q)) end ), Imports = lists:append([case Has_slices of true -> [<<"import gleam/list"/utf8>>]; false -> [] end, [<<"import "/utf8, (sqlode@codegen@common:runtime_import_path(Gleam))/binary>>], case Has_any_params of true -> [<<<<"import "/utf8, Module_path/binary>>/binary, "/params"/utf8>>]; false -> [] end]), gleam@string:join( lists:append( [[<<"// Code generated by sqlode. DO NOT EDIT."/utf8>>, <<"// engine: "/utf8, (sqlode@model:engine_to_string(Engine))/binary>>, <<"// runtime: "/utf8, (sqlode@model:runtime_to_string(Runtime))/binary>>, <<""/utf8>>], Imports, [<<""/utf8>>, <<"pub fn all() -> List(runtime.QueryInfo) {"/utf8>>, <<" "/utf8, All_items/binary>>, <<"}"/utf8>>, <<""/utf8>>, Query_functions]] ), <<"\n"/utf8>> ).