Packages

A convention-first web framework for Gleam

Current section

Files

Jump to
refrakt src refrakt@cli@migrate_cmd.erl
Raw

src/refrakt@cli@migrate_cmd.erl

-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 => <<?FILEPATH/utf8>>,
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.