ConsoleRunner.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using Microsoft.Extensions.DependencyInjection;
  2. using RackPeek.Domain;
  3. using Spectre.Console;
  4. using Spectre.Console.Cli;
  5. using Spectre.Console.Testing;
  6. namespace RackPeek;
  7. public class ConsoleEmulator : IConsoleEmulator
  8. {
  9. public CommandApp App { get; }
  10. public ConsoleEmulator(IServiceProvider provider)
  11. {
  12. var registrar = new TypeRegistrar(provider);
  13. App = new CommandApp(registrar);
  14. CliBootstrap.BuildApp(App);
  15. }
  16. public async Task<string> Execute(string input)
  17. {
  18. var testConsole = new TestConsole();
  19. testConsole.Width(120);
  20. AnsiConsole.Console = testConsole;
  21. App.Configure(c => c.Settings.Console = testConsole);
  22. await App.RunAsync(input.Split(" ", StringSplitOptions.RemoveEmptyEntries));
  23. return testConsole.Output;
  24. }
  25. }
  26. public sealed class TypeRegistrar : ITypeRegistrar
  27. {
  28. private readonly IServiceProvider _provider;
  29. public TypeRegistrar(IServiceProvider provider)
  30. {
  31. _provider = provider;
  32. }
  33. public void Register(Type service, Type implementation)
  34. {
  35. // DO NOTHING — services must already be registered
  36. }
  37. public void RegisterInstance(Type service, object implementation)
  38. {
  39. // DO NOTHING
  40. }
  41. public void RegisterLazy(Type service, Func<object> factory)
  42. {
  43. // DO NOTHING
  44. }
  45. public ITypeResolver Build()
  46. {
  47. return new TypeResolver(_provider);
  48. }
  49. }
  50. public sealed class TypeResolver : ITypeResolver
  51. {
  52. private readonly IServiceProvider _provider;
  53. public TypeResolver(IServiceProvider provider)
  54. {
  55. _provider = provider;
  56. }
  57. public object? Resolve(Type? type)
  58. => type == null ? null : _provider.GetService(type);
  59. }