-module(refrakt@cli@migrate_cmd). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/refrakt/cli/migrate_cmd.gleam"). -export([run/0]). -file("src/refrakt/cli/migrate_cmd.gleam", 70). -spec migrate_module_postgres(binary()) -> binary(). migrate_module_postgres(App) -> <<<<<<<<<<<<<<<<"/// Run pending database migrations. /// /// Usage: gleam run -m "/utf8, App/binary>>/binary, "/migrate /// import gleam/erlang/process import gleam/io import gleam/list import gleam/result import gleam/string import "/utf8>>/binary, App/binary>>/binary, "/config import "/utf8>>/binary, App/binary>>/binary, "/data/repo import pog import refrakt/migrate import simplifile pub fn main() { let cfg = config.load() let assert Ok(db) = repo.connect(cfg) let migrations_dir = \"src/"/utf8>>/binary, App/binary>>/binary, "/data/migrations\" let execute = fn(sql: String) -> Result(Nil, String) { pog.query(sql) |> pog.execute(db) |> result.replace(Nil) |> result.replace_error(\"query failed\") } let query_strings = fn(sql: String) -> Result(List(String), String) { pog.query(sql) |> pog.returning(fn(row) { use name <- gleam/dynamic/decode.field(0, gleam/dynamic/decode.string) gleam/dynamic/decode.success(name) }) |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.replace_error(\"query failed\") } case migrate.run_from_directory(execute, query_strings, migrations_dir) { Ok(count) -> io.println( \"Done. \" <> int_to_string(count) <> \" migration(s) applied.\", ) Error(err) -> io.println(\"Error: \" <> err) } } fn int_to_string(n: Int) -> String { case n { 0 -> \"0\" 1 -> \"1\" 2 -> \"2\" 3 -> \"3\" _ -> \"several\" } } "/utf8>>. -file("src/refrakt/cli/migrate_cmd.gleam", 132). -spec migrate_module_sqlite(binary()) -> binary(). migrate_module_sqlite(App) -> <<<<<<<<<<<<<<<<"/// Run pending database migrations. /// /// Usage: gleam run -m "/utf8, App/binary>>/binary, "/migrate /// import gleam/io import gleam/list import gleam/result import gleam/string import "/utf8>>/binary, App/binary>>/binary, "/config import "/utf8>>/binary, App/binary>>/binary, "/data/repo import refrakt/migrate import sqlight pub fn main() { let cfg = config.load() let db_path = repo.database_path(cfg) let migrations_dir = \"src/"/utf8>>/binary, App/binary>>/binary, "/data/migrations\" use conn <- sqlight.with_connection(db_path) let execute = fn(sql: String) -> Result(Nil, String) { sqlight.exec(sql, conn) |> result.replace_error(\"query failed\") } let query_strings = fn(sql: String) -> Result(List(String), String) { sqlight.query(sql, on: conn, with: [], expecting: fn(row) { use name <- gleam/dynamic/decode.field(0, gleam/dynamic/decode.string) gleam/dynamic/decode.success(name) }) |> result.replace_error(\"query failed\") } case migrate.run_from_directory(execute, query_strings, migrations_dir) { Ok(count) -> io.println( \"Done. \" <> int_to_string(count) <> \" migration(s) applied.\", ) Error(err) -> io.println(\"Error: \" <> err) } } fn int_to_string(n: Int) -> String { case n { 0 -> \"0\" 1 -> \"1\" 2 -> \"2\" 3 -> \"3\" _ -> \"several\" } } "/utf8>>. -file("src/refrakt/cli/migrate_cmd.gleam", 16). -spec run() -> nil. run() -> App = refrakt@cli@project:app_name(), Db = refrakt@cli@project:detect_db(), Migrations_dir = <<<<"src/"/utf8, App/binary>>/binary, "/data/migrations"/utf8>>, Migrate_module = <<<<"src/"/utf8, App/binary>>/binary, "/migrate.gleam"/utf8>>, case Db of no_db -> gleam_stdlib:println(<<"No database configured."/utf8>>), gleam_stdlib:println( <<"Create a project with --db postgres or --db sqlite."/utf8>> ); _ -> case simplifile_erl:read_directory(Migrations_dir) of {error, _} -> gleam_stdlib:println( <<"No migrations directory found at "/utf8, Migrations_dir/binary>> ), gleam_stdlib:println( <<"Generate a resource first: refrakt gen resource ..."/utf8>> ); {ok, Files} -> Sql_files = begin _pipe = Files, gleam@list:filter( _pipe, fun(F) -> gleam_stdlib:string_ends_with( F, <<".sql"/utf8>> ) end ) end, case Sql_files of [] -> gleam_stdlib:println( <<"No migration files found."/utf8>> ); _ -> case simplifile:read(Migrate_module) of {ok, _} -> nil; {error, _} -> Content = case Db of postgres -> migrate_module_postgres(App); sqlite -> migrate_module_sqlite(App); no_db -> <<""/utf8>> end, case simplifile:write( Migrate_module, Content ) of {ok, _} -> nil; _assert_fail -> erlang:error( #{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"refrakt/cli/migrate_cmd"/utf8>>, function => <<"run"/utf8>>, line => 51, value => _assert_fail, start => 1710, 'end' => 1770, pattern_start => 1721, pattern_end => 1726} ) end, refrakt_format_ffi:format_files( [Migrate_module] ), gleam_stdlib:println( <<"Created: "/utf8, Migrate_module/binary>> ) end, gleam_stdlib:println( <<"Running migrations..."/utf8>> ), gleam_stdlib:println(<<""/utf8>>), Output = refrakt_build_ffi:run_cmd( <<<<"gleam run -m "/utf8, App/binary>>/binary, "/migrate"/utf8>> ), gleam_stdlib:println(Output) end end end.