GenerateHostsFileCommand.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using Microsoft.Extensions.DependencyInjection;
  2. using RackPeek.Domain.UseCases.Hosts;
  3. using Spectre.Console;
  4. using Spectre.Console.Cli;
  5. namespace Shared.Rcl.Commands.Exporters;
  6. public sealed class GenerateHostsFileCommand(IServiceProvider provider)
  7. : AsyncCommand<GenerateHostsFileSettings> {
  8. public override async Task<int> ExecuteAsync(
  9. CommandContext context,
  10. GenerateHostsFileSettings settings,
  11. CancellationToken cancellationToken) {
  12. using IServiceScope scope = provider.CreateScope();
  13. HostsFileExportUseCase useCase = scope.ServiceProvider
  14. .GetRequiredService<HostsFileExportUseCase>();
  15. var options = new HostsExportOptions {
  16. IncludeTags = ParseCsv(settings.IncludeTags),
  17. DomainSuffix = settings.DomainSuffix,
  18. IncludeLocalhostDefaults = !settings.NoLocalhost
  19. };
  20. HostsExportResult? result = await useCase.ExecuteAsync(options);
  21. if (result is null) {
  22. AnsiConsole.MarkupLine("[red]Hosts export returned null.[/]");
  23. return -1;
  24. }
  25. if (result.Warnings.Any()) {
  26. AnsiConsole.MarkupLine("[yellow]Warnings:[/]");
  27. foreach (var warning in result.Warnings)
  28. AnsiConsole.MarkupLine($"[yellow]- {Markup.Escape(warning)}[/]");
  29. AnsiConsole.WriteLine();
  30. }
  31. if (!string.IsNullOrWhiteSpace(settings.OutputPath)) {
  32. await File.WriteAllTextAsync(
  33. settings.OutputPath,
  34. result.HostsText,
  35. cancellationToken);
  36. AnsiConsole.MarkupLine(
  37. $"[green]Hosts file written to:[/] {Markup.Escape(settings.OutputPath)}");
  38. }
  39. else {
  40. AnsiConsole.MarkupLine("[green]Generated Hosts File:[/]");
  41. AnsiConsole.WriteLine();
  42. AnsiConsole.Write(result.HostsText);
  43. }
  44. return 0;
  45. }
  46. private static IReadOnlyList<string> ParseCsv(string? raw) {
  47. if (string.IsNullOrWhiteSpace(raw))
  48. return [];
  49. return raw.Split(',', StringSplitOptions.RemoveEmptyEntries)
  50. .Select(x => x.Trim())
  51. .Where(x => !string.IsNullOrWhiteSpace(x))
  52. .ToArray();
  53. }
  54. }