-module(parrot@internal@sqlc). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -define(FILEPATH, "src/parrot/internal/sqlc.gleam"). -export([decode_sqlc/1, gen_sqlc_yaml/2, sqlc_binary_path/0, get_os/0, get_cpu/0, download_zip/1, extract_sqlc_binary/1, verify_binary/0, download_binary/0]). -export_type([type_ref/0, table_column/0, table_ref/0, table/0, schema/0, enum/0, catalog/0, query_cmd/0, query_param/0, 'query'/0, s_q_l_c/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 type_ref() :: {type_ref, binary(), binary(), binary()}. -type table_column() :: {table_column, binary(), boolean(), boolean(), binary(), integer(), boolean(), boolean(), binary(), binary(), boolean(), binary(), boolean(), integer(), gleam@option:option(table_ref()), type_ref()}. -type table_ref() :: {table_ref, binary(), binary(), binary()}. -type table() :: {table, table_ref(), binary(), list(table_column())}. -type schema() :: {schema, binary(), binary(), list(table()), list(enum())}. -type enum() :: {enum, binary(), list(binary()), binary()}. -type catalog() :: {catalog, binary(), binary(), binary(), list(schema())}. -type query_cmd() :: one | many | exec | exec_result. -type query_param() :: {query_param, integer(), table_column()}. -type 'query'() :: {'query', binary(), binary(), query_cmd(), binary(), list(table_column()), gleam@option:option(table_ref()), list(binary()), list(query_param())}. -type s_q_l_c() :: {s_q_l_c, binary(), binary(), binary(), catalog(), list('query'())}. -file("src/parrot/internal/sqlc.gleam", 101). ?DOC(false). -spec decode_sqlc(gleam@dynamic:dynamic_()) -> {ok, s_q_l_c()} | {error, list(gleam@dynamic@decode:decode_error())}. decode_sqlc(Data) -> Table_ref_decoder = begin gleam@dynamic@decode:field( <<"name"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Name) -> gleam@dynamic@decode:field( <<"schema"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Schema) -> gleam@dynamic@decode:field( <<"catalog"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Catalog) -> gleam@dynamic@decode:success( {table_ref, Catalog, Schema, Name} ) end ) end ) end ) end, Type_ref_decoder = begin gleam@dynamic@decode:field( <<"schema"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Schema@1) -> gleam@dynamic@decode:field( <<"catalog"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Catalog@1) -> gleam@dynamic@decode:field( <<"name"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Name@1) -> gleam@dynamic@decode:success( {type_ref, Catalog@1, Schema@1, Name@1} ) end ) end ) end ) end, Table_col_decoder = begin gleam@dynamic@decode:field( <<"name"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Name@2) -> gleam@dynamic@decode:field( <<"not_null"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Not_null) -> gleam@dynamic@decode:field( <<"is_array"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Is_array) -> gleam@dynamic@decode:field( <<"comment"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Comment) -> gleam@dynamic@decode:field( <<"length"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Length) -> gleam@dynamic@decode:field( <<"is_named_param"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Is_named_param) -> gleam@dynamic@decode:field( <<"is_func_call"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun(Is_func_call) -> gleam@dynamic@decode:field( <<"scope"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Scope) -> gleam@dynamic@decode:field( <<"table_alias"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun( Table_alias ) -> gleam@dynamic@decode:field( <<"is_sqlc_slice"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun( Is_sqlc_slice ) -> gleam@dynamic@decode:field( <<"original_name"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun( Original_name ) -> gleam@dynamic@decode:field( <<"unsigned"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_bool/1}, fun( Unsigned ) -> gleam@dynamic@decode:field( <<"array_dims"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun( Array_dims ) -> gleam@dynamic@decode:field( <<"table"/utf8>>, gleam@dynamic@decode:optional( Table_ref_decoder ), fun( Table ) -> gleam@dynamic@decode:field( <<"type"/utf8>>, Type_ref_decoder, fun( Type_ref ) -> _pipe = {table_column, Name@2, Not_null, Is_array, Comment, Length, Is_named_param, Is_func_call, Scope, Table_alias, Is_sqlc_slice, Original_name, Unsigned, Array_dims, Table, Type_ref}, gleam@dynamic@decode:success( _pipe ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end ) end, Table_decoder = begin gleam@dynamic@decode:field( <<"rel"/utf8>>, Table_ref_decoder, fun(Rel) -> gleam@dynamic@decode:field( <<"comment"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Comment@1) -> gleam@dynamic@decode:field( <<"columns"/utf8>>, gleam@dynamic@decode:list(Table_col_decoder), fun(Columns) -> gleam@dynamic@decode:success( {table, Rel, Comment@1, Columns} ) end ) end ) end ) end, Enum_decoder = begin gleam@dynamic@decode:field( <<"name"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Name@3) -> gleam@dynamic@decode:field( <<"vals"/utf8>>, gleam@dynamic@decode:list( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Vals) -> gleam@dynamic@decode:field( <<"comment"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Comment@2) -> gleam@dynamic@decode:success( {enum, Name@3, Vals, Comment@2} ) end ) end ) end ) end, Schema_decoder = begin gleam@dynamic@decode:field( <<"comment"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Comment@3) -> gleam@dynamic@decode:field( <<"name"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Name@4) -> gleam@dynamic@decode:field( <<"tables"/utf8>>, gleam@dynamic@decode:list(Table_decoder), fun(Tables) -> gleam@dynamic@decode:field( <<"enums"/utf8>>, gleam@dynamic@decode:list(Enum_decoder), fun(Enums) -> gleam@dynamic@decode:success( {schema, Comment@3, Name@4, Tables, Enums} ) end ) end ) end ) end ) end, Catalog_decoder = begin gleam@dynamic@decode:field( <<"comment"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Comment@4) -> gleam@dynamic@decode:field( <<"default_schema"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Default_schema) -> gleam@dynamic@decode:field( <<"name"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Name@5) -> gleam@dynamic@decode:field( <<"schemas"/utf8>>, gleam@dynamic@decode:list(Schema_decoder), fun(Schemas) -> gleam@dynamic@decode:success( {catalog, Comment@4, Default_schema, Name@5, Schemas} ) end ) end ) end ) end ) end, Params_decoder = begin gleam@dynamic@decode:field( <<"number"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Number) -> gleam@dynamic@decode:field( <<"column"/utf8>>, Table_col_decoder, fun(Column) -> gleam@dynamic@decode:success( {query_param, Number, Column} ) end ) end ) end, Cmd_decoder = begin gleam@dynamic@decode:then( {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Cmd) -> case Cmd of <<":one"/utf8>> -> gleam@dynamic@decode:success(one); <<":many"/utf8>> -> gleam@dynamic@decode:success(many); <<":exec"/utf8>> -> gleam@dynamic@decode:success(exec_result); <<":execresult"/utf8>> -> gleam@dynamic@decode:success(exec_result); _ -> gleam@dynamic@decode:failure(one, <<"QueryCmd"/utf8>>) end end ) end, Query_decoder = begin gleam@dynamic@decode:field( <<"text"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Text) -> gleam@dynamic@decode:field( <<"name"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Name@6) -> gleam@dynamic@decode:field( <<"cmd"/utf8>>, Cmd_decoder, fun(Cmd@1) -> gleam@dynamic@decode:field( <<"filename"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Filename) -> gleam@dynamic@decode:field( <<"columns"/utf8>>, gleam@dynamic@decode:list( Table_col_decoder ), fun(Columns@1) -> gleam@dynamic@decode:field( <<"insert_into_table"/utf8>>, gleam@dynamic@decode:optional( Table_ref_decoder ), fun(Insert_into_table) -> gleam@dynamic@decode:field( <<"comments"/utf8>>, gleam@dynamic@decode:list( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Comments) -> gleam@dynamic@decode:field( <<"params"/utf8>>, gleam@dynamic@decode:list( Params_decoder ), fun(Params) -> _pipe@1 = {'query', Text, Name@6, Cmd@1, Filename, Columns@1, Insert_into_table, Comments, Params}, gleam@dynamic@decode:success( _pipe@1 ) end ) end ) end ) end ) end ) end ) end ) end ) end, Decoder = begin gleam@dynamic@decode:field( <<"sqlc_version"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Sqlc_version) -> gleam@dynamic@decode:field( <<"plugin_options"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Plugin_options) -> gleam@dynamic@decode:field( <<"global_options"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Global_options) -> gleam@dynamic@decode:field( <<"catalog"/utf8>>, Catalog_decoder, fun(Catalog@2) -> gleam@dynamic@decode:field( <<"queries"/utf8>>, gleam@dynamic@decode:list( Query_decoder ), fun(Queries) -> _pipe@2 = {s_q_l_c, Sqlc_version, Plugin_options, Global_options, Catalog@2, Queries}, gleam@dynamic@decode:success( _pipe@2 ) end ) end ) end ) end ) end ) end, gleam@dynamic@decode:run(Data, Decoder). -file("src/parrot/internal/sqlc.gleam", 263). ?DOC(false). -spec engine_to_sqlc_string(parrot@internal@cli:engine()) -> binary(). engine_to_sqlc_string(Engine) -> case Engine of my_s_q_l -> <<"mysql"/utf8>>; postgre_s_q_l -> <<"postgresql"/utf8>>; s_qlite -> <<"sqlite"/utf8>> end. -file("src/parrot/internal/sqlc.gleam", 240). ?DOC(false). -spec gen_sqlc_yaml(parrot@internal@cli:engine(), list(binary())) -> binary(). gen_sqlc_yaml(Engine, Queries) -> Result = <<<<<<<<" version: \"2\" plugins: - name: jsonb wasm: url: https://github.com/daniellionel01/sqlc-gen-json/releases/download/v1.0.0/sqlc-gen-json.wasm sha256: ffbd8cfaecc971d8cdf145591eac28731ffb50b7348131868ce66cc0e3192b7e sql: - schema: schema.sql queries: ["/utf8, (gleam@string:join(Queries, <<", "/utf8>>))/binary>>/binary, "] engine: "/utf8>>/binary, (engine_to_sqlc_string(Engine))/binary>>/binary, " codegen: - out: . plugin: jsonb options: indent: \" \" filename: queries.json "/utf8>>, gleam@string:trim(Result). -file("src/parrot/internal/sqlc.gleam", 271). ?DOC(false). -spec sqlc_binary_path() -> binary(). sqlc_binary_path() -> filepath:join(parrot@internal@project:root(), <<"build/.parrot/sqlc"/utf8>>). -file("src/parrot/internal/sqlc.gleam", 275). ?DOC(false). -spec binary_exists(binary()) -> boolean(). binary_exists(Path) -> case simplifile_erl:is_file(Path) of {ok, true} -> true; {ok, false} -> false; {error, _} -> false end. -file("src/parrot/internal/sqlc.gleam", 396). ?DOC(false). -spec get_os() -> binary(). get_os() -> parrot_ffi:get_os(). -file("src/parrot/internal/sqlc.gleam", 399). ?DOC(false). -spec get_cpu() -> binary(). get_cpu() -> parrot_ffi:get_cpu(). -file("src/parrot/internal/sqlc.gleam", 402). ?DOC(false). -spec download_zip(binary()) -> {ok, bitstring()} | {error, gleam@dynamic:dynamic_()}. download_zip(Url) -> parrot_ffi:download_zip(Url). -file("src/parrot/internal/sqlc.gleam", 405). ?DOC(false). -spec extract_sqlc_binary(bitstring()) -> {ok, bitstring()} | {error, gleam@dynamic:dynamic_()}. extract_sqlc_binary(Tarball) -> parrot_ffi:extract_sqlc_binary(Tarball). -file("src/parrot/internal/sqlc.gleam", 284). ?DOC(false). -spec get_download_path() -> {ok, binary()} | {error, parrot@internal@errors:parrot_error()}. get_download_path() -> Base = <<"https://downloads.sqlc.dev/sqlc_"/utf8, "1.29.0"/utf8>>, Os = parrot_ffi:get_os(), Cpu = parrot_ffi:get_cpu(), Platform = case {Os, Cpu} of {<<"darwin"/utf8>>, <<"arm64"/utf8>>} -> {ok, <<"_darwin_arm64.tar.gz"/utf8>>}; {<<"darwin"/utf8>>, <<"aarch64"/utf8>>} -> {ok, <<"_darwin_arm64.tar.gz"/utf8>>}; {<<"darwin"/utf8>>, <<"amd64"/utf8>>} -> {ok, <<"_darwin_amd64.tar.gz"/utf8>>}; {<<"darwin"/utf8>>, <<"x86_64"/utf8>>} -> {ok, <<"_darwin_amd64.tar.gz"/utf8>>}; {<<"darwin"/utf8>>, <<"x64"/utf8>>} -> {ok, <<"_darwin_amd64.tar.gz"/utf8>>}; {<<"linux"/utf8>>, <<"arm64"/utf8>>} -> {ok, <<"_linux_arm64.tar.gz"/utf8>>}; {<<"linux"/utf8>>, <<"aarch64"/utf8>>} -> {ok, <<"_linux_arm64.tar.gz"/utf8>>}; {<<"linux"/utf8>>, <<"amd64"/utf8>>} -> {ok, <<"_linux_amd64.tar.gz"/utf8>>}; {<<"linux"/utf8>>, <<"x86_64"/utf8>>} -> {ok, <<"_linux_amd64.tar.gz"/utf8>>}; {<<"linux"/utf8>>, <<"x64"/utf8>>} -> {ok, <<"_linux_amd64.tar.gz"/utf8>>}; {<<"win32"/utf8>>, <<"amd64"/utf8>>} -> {ok, <<"_windows_amd64.tar.gz"/utf8>>}; {<<"win32"/utf8>>, <<"x86_64"/utf8>>} -> {ok, <<"_windows_amd64.tar.gz"/utf8>>}; {<<"win32"/utf8>>, <<"x64"/utf8>>} -> {ok, <<"_windows_amd64.tar.gz"/utf8>>}; {_, _} -> {error, <<""/utf8>>} end, given:ok( Platform, fun(_) -> {error, {sqlc_download_error, <<<<<<"unsupported platform: "/utf8, Os/binary>>/binary, ", "/utf8>>/binary, Cpu/binary>>}} end, fun(Platform@1) -> {ok, <>} end ). -file("src/parrot/internal/sqlc.gleam", 319). ?DOC(false). -spec verify_binary() -> {ok, nil} | {error, parrot@internal@errors:parrot_error()}. verify_binary() -> gleam@result:'try'( get_download_path(), fun(Download) -> Path = sqlc_binary_path(), In = filepath:directory_name(Path), Gen_res = shellout:command( <<"./sqlc"/utf8>>, [<<"version"/utf8>>], In, [] ), case Gen_res of {error, _} -> Information = begin _pipe = [<<"download path: "/utf8, Download/binary>>, <<"os: "/utf8, (parrot_ffi:get_os())/binary>>, <<"cpu: "/utf8, (parrot_ffi:get_cpu())/binary>>, <<"sqlc path: "/utf8, Path/binary>>, <<"parrot build path: "/utf8, In/binary>>], gleam@string:join(_pipe, <<"\n"/utf8>>) end, {error, {sqlc_download_error, <<"could not verify sqlc binary. information:\n"/utf8, Information/binary>>}}; {ok, V} -> Sqlc_version = <<"v"/utf8, "1.29.0"/utf8>>, V@1 = gleam@string:trim(V), case V@1 =:= Sqlc_version of true -> {ok, nil}; false -> {error, {sqlc_download_error, <<<<<<"Could not match sqlc version. Wanted "/utf8, Sqlc_version/binary>>/binary, ". Received "/utf8>>/binary, V@1/binary>>}} end end end ). -file("src/parrot/internal/sqlc.gleam", 358). ?DOC(false). -spec download_binary() -> {ok, nil} | {error, parrot@internal@errors:parrot_error()}. download_binary() -> Path = sqlc_binary_path(), Dir = filepath:directory_name(Path), case simplifile:create_directory_all(Dir) of {ok, _} -> nil; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"parrot/internal/sqlc"/utf8>>, function => <<"download_binary"/utf8>>, line => 361, value => _assert_fail, start => 9619, 'end' => 9674, pattern_start => 9630, pattern_end => 9635}) end, Binary_exists = binary_exists(Path), given:that( Binary_exists, fun() -> {ok, nil} end, fun() -> gleam@result:'try'( get_download_path(), fun(Download) -> gleam@result:'try'( begin _pipe = parrot_ffi:download_zip(Download), gleam@result:map_error( _pipe, fun(_) -> {sqlc_download_error, <<"could not curl the sqlc binary"/utf8>>} end ) end, fun(Tarball) -> gleam@result:'try'( begin _pipe@1 = parrot_ffi:extract_sqlc_binary( Tarball ), gleam@result:map_error( _pipe@1, fun(_) -> {sqlc_download_error, <<"could not unzip the sqlc binary"/utf8>>} end ) end, fun(Bin) -> case simplifile_erl:write_bits(Path, Bin) of {ok, _} -> nil; _assert_fail@1 -> erlang:error( #{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"parrot/internal/sqlc"/utf8>>, function => <<"download_binary"/utf8>>, line => 382, value => _assert_fail@1, start => 10168, 'end' => 10219, pattern_start => 10179, pattern_end => 10184} ) end, Permissions = {file_permissions, gleam@set:from_list( [read, write, execute] ), gleam@set:from_list([read, execute]), gleam@set:from_list([read, execute])}, _ = simplifile:set_permissions( Path, Permissions ), {ok, nil} end ) end ) end ) end ).