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;
}
}