using System; using System.CommandLine; using Microsoft.Extensions.Logging; using Migrato.Cli; using Migrato.Core; using Migrato.Sqlite; using Spectre.Console; namespace Migrato.Cli.Commands; /// /// Applies pending migrations /// internal static class UpCommand { public static Command Build() { var command = new Command("up", "Applies pending migrations") { MigrationOptions.Dir, MigrationOptions.Db, MigrationOptions.Verbose }; command.SetAction(parseResult => { var dir = parseResult.GetValue(MigrationOptions.Dir)!; var db = parseResult.GetValue(MigrationOptions.Db)!; var verbose = parseResult.GetValue(MigrationOptions.Verbose); try { var migrations = MigrationLoader.LoadFromDirectory(dir); IMigrationProvider provider = new SqliteMigrationProvider(); using var connection = provider.CreateConnection(db); using var loggerFactory = Logging.CreateFactory(verbose); var runner = new MigrationRunner(provider, loggerFactory.CreateLogger()); var applied = runner.MigrateUp(connection, migrations); if (applied.Count == 0) { AnsiConsole.MarkupLine("[yellow]No pending migrations.[/]"); return 0; } foreach (var migration in applied) { AnsiConsole.MarkupLineInterpolated($"[green]Applied[/] {migration.Version}_{migration.Name}"); } return 0; } catch (Exception ex) { AnsiConsole.MarkupLineInterpolated($"[red]Error:[/] {ex.Message}"); return 1; } }); return command; } }