feat: Dynamic command loader, default command with module registry
This commit is contained in:
		
							
								
								
									
										26
									
								
								Commands/Container/Module.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Commands/Container/Module.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
using Automancer.Command.Image;
 | 
			
		||||
using Automancer.Common;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Automancer.Command.Container;
 | 
			
		||||
 | 
			
		||||
public class Module : ICommandModuleWithRegistry
 | 
			
		||||
{
 | 
			
		||||
    public void Configure(IConfigurator config)
 | 
			
		||||
    {
 | 
			
		||||
        // No implementation needed here
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void Configure(IConfigurator config, CommandRegistry registry)
 | 
			
		||||
    {
 | 
			
		||||
        config.AddBranch("container", container =>
 | 
			
		||||
        {
 | 
			
		||||
            var description = "Container operations";
 | 
			
		||||
            
 | 
			
		||||
            container.SetDescription(description);
 | 
			
		||||
            registry.Add("container", description);
 | 
			
		||||
 | 
			
		||||
            container.AddCommand<PsCommand>("ps").WithDescription("List containers");
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								Commands/Container/PsCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								Commands/Container/PsCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Automancer.Command.Image;
 | 
			
		||||
 | 
			
		||||
public class PsSettings: CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "[path]")]
 | 
			
		||||
    [Description("Path to the Dockerfile")]
 | 
			
		||||
    public string? Path { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("-t|--tag")]
 | 
			
		||||
    [Description("Tag to use for the image")]
 | 
			
		||||
    public string? Tag { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("-f|--file")]
 | 
			
		||||
    [Description("Path to the Dockerfile")]
 | 
			
		||||
    public string? File { get; set; }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public class PsCommand: Command<BuldSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, BuldSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        Console.WriteLine($"Building image from {settings.Path} with tag {settings.Tag}");
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										34
									
								
								Commands/Image/BuildCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								Commands/Image/BuildCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Automancer.Command.Image;
 | 
			
		||||
 | 
			
		||||
public class BuldSettings: CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "[path]")]
 | 
			
		||||
    [Description("Path to the Dockerfile")]
 | 
			
		||||
    public string? Path { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("-t|--tag")]
 | 
			
		||||
    [Description("Tag to use for the image")]
 | 
			
		||||
    public string? Tag { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("-f|--file")]
 | 
			
		||||
    [Description("Path to the Dockerfile")]
 | 
			
		||||
    public string? File { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("--push")]
 | 
			
		||||
    [Description("Push the image after building it")]
 | 
			
		||||
    public bool Push { get; set; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public class BuildCommand : Command<BuldSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, BuldSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        Console.WriteLine($"Building image from {settings.Path} with tag {settings.Tag}");
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										25
									
								
								Commands/Image/Module.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Commands/Image/Module.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
using Automancer.Common;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Automancer.Command.Image;
 | 
			
		||||
 | 
			
		||||
public class Module : ICommandModuleWithRegistry
 | 
			
		||||
{
 | 
			
		||||
    public void Configure(IConfigurator config)
 | 
			
		||||
    {
 | 
			
		||||
        // No implementation needed here
 | 
			
		||||
    }
 | 
			
		||||
    public void Configure(IConfigurator config, CommandRegistry registry)
 | 
			
		||||
    {
 | 
			
		||||
        config.AddBranch("image", image => {
 | 
			
		||||
            var description = "Docker/podman image operations";
 | 
			
		||||
            image.SetDescription(description);
 | 
			
		||||
            registry.Add("image", description);
 | 
			
		||||
 | 
			
		||||
            image.AddCommand<BuildCommand>("build").WithDescription("Build a docker image");
 | 
			
		||||
            image.AddCommand<PushCommand>("push").WithDescription("Push a docker image");
 | 
			
		||||
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								Commands/Image/PushCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								Commands/Image/PushCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Automancer.Command.Image;
 | 
			
		||||
 | 
			
		||||
public class PushSettings: CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "[path]")]
 | 
			
		||||
    [Description("Path to the Dockerfile")]
 | 
			
		||||
    public string? Path { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("-t|--tag")]
 | 
			
		||||
    [Description("Tag to use for the image")]
 | 
			
		||||
    public string? Tag { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("-f|--file")]
 | 
			
		||||
    [Description("Path to the Dockerfile")]
 | 
			
		||||
    public string? File { get; set; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public class PushCommand : Command<BuldSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, BuldSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        Console.WriteLine($"Building image from {settings.Path} with tag {settings.Tag}");
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										38
									
								
								Commands/RootCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								Commands/RootCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
using Automancer.Common;
 | 
			
		||||
using Spectre.Console;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
using System.Diagnostics.CodeAnalysis;
 | 
			
		||||
 | 
			
		||||
namespace Automancer.Commands;
 | 
			
		||||
 | 
			
		||||
public class RootCommand : Spectre.Console.Cli.Command
 | 
			
		||||
{
 | 
			
		||||
    private readonly CommandRegistry _registry;
 | 
			
		||||
 | 
			
		||||
    public RootCommand(CommandRegistry registry)
 | 
			
		||||
    {
 | 
			
		||||
        _registry = registry;
 | 
			
		||||
    }
 | 
			
		||||
    public override int Execute([NotNull] CommandContext context)
 | 
			
		||||
    {
 | 
			
		||||
        AnsiConsole.Write(
 | 
			
		||||
            new FigletText("AUTOMANCER")
 | 
			
		||||
                .Centered()
 | 
			
		||||
                .Color(Color.Cyan1));
 | 
			
		||||
 | 
			
		||||
        AnsiConsole.MarkupLine("[bold]Automancer[/] is a modular CLI automation tool. It is designed to be extensible and easy to use.");
 | 
			
		||||
        AnsiConsole.MarkupLine("Use [green]--help[/] or [green]<command> --help[/] to get started.");
 | 
			
		||||
 | 
			
		||||
        var table = new Table().Border(TableBorder.Rounded);
 | 
			
		||||
        table.AddColumn("[bold yellow]Module[/]");
 | 
			
		||||
        table.AddColumn("[bold yellow]Description[/]");
 | 
			
		||||
 | 
			
		||||
        foreach (var cmd in _registry.Commands.OrderBy(c => c.Path))
 | 
			
		||||
        {
 | 
			
		||||
            table.AddRow($"[green]{cmd.Path}[/]", cmd.Description ?? "[dim]n/a[/]");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        AnsiConsole.Write(table);   
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user