mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-11-04 10:35:27 +08:00 
			
		
		
		
	* Fixes a bug with `SelectionPrompt` and page size. * Allow `IAnsiConsoleInput` to return `null`.
		
			
				
	
	
		
			100 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Diagnostics.CodeAnalysis;
 | 
						|
using System.IO;
 | 
						|
using System.Linq;
 | 
						|
using System.Text;
 | 
						|
using Generator.Commands.Samples;
 | 
						|
using Spectre.Console;
 | 
						|
using Spectre.Console.Cli;
 | 
						|
 | 
						|
namespace Generator.Commands
 | 
						|
{
 | 
						|
    internal class SampleCommand : Command<SampleCommand.Settings>
 | 
						|
    {
 | 
						|
        public class Settings : CommandSettings
 | 
						|
        {
 | 
						|
            public Settings(string outputPath, string sample, bool list)
 | 
						|
            {
 | 
						|
                Sample = sample;
 | 
						|
                OutputPath = outputPath ?? Environment.CurrentDirectory;
 | 
						|
                List = list;
 | 
						|
            }
 | 
						|
 | 
						|
            [CommandArgument(0, "[sample]")]
 | 
						|
            public string Sample { get; }
 | 
						|
 | 
						|
            [CommandOption("-o|--output")]
 | 
						|
            public string OutputPath { get; }
 | 
						|
 | 
						|
            [CommandOption("-l|--list")]
 | 
						|
            public bool List { get; }
 | 
						|
        }
 | 
						|
 | 
						|
        private readonly IAnsiConsole _console;
 | 
						|
 | 
						|
        public SampleCommand(IAnsiConsole console)
 | 
						|
        {
 | 
						|
            _console = new AsciiCastConsole(console);
 | 
						|
        }
 | 
						|
 | 
						|
        public override int Execute([NotNull] CommandContext context, [NotNull] Settings settings)
 | 
						|
        {
 | 
						|
            var samples = typeof(BaseSample).Assembly
 | 
						|
                .GetTypes()
 | 
						|
                .Where(i => i.IsClass && i.IsAbstract == false && i.IsSubclassOf(typeof(BaseSample)))
 | 
						|
                .Select(Activator.CreateInstance)
 | 
						|
                .Cast<BaseSample>();
 | 
						|
 | 
						|
            var selectedSample = settings.Sample;
 | 
						|
            if (settings.List)
 | 
						|
            {
 | 
						|
                selectedSample = AnsiConsole.Prompt(
 | 
						|
                    new SelectionPrompt<string>()
 | 
						|
                        .Title("Select an example to record")
 | 
						|
                        .PageSize(25)
 | 
						|
                        .AddChoices(samples.Select(x => x.Name())));
 | 
						|
            }
 | 
						|
 | 
						|
            if (!string.IsNullOrWhiteSpace(selectedSample))
 | 
						|
            {
 | 
						|
                var desiredSample = samples.FirstOrDefault(i => i.Name().Equals(selectedSample, StringComparison.OrdinalIgnoreCase));
 | 
						|
                if (desiredSample == null)
 | 
						|
                {
 | 
						|
                    _console.MarkupLine($"[red]Error:[/] could not find sample [blue]{selectedSample}[/]");
 | 
						|
                    return -1;
 | 
						|
                }
 | 
						|
 | 
						|
                samples = new List<BaseSample> { desiredSample };
 | 
						|
            }
 | 
						|
 | 
						|
            // from here on out everything we write will be recorded.
 | 
						|
            var recorder = _console.WrapWithAsciiCastRecorder();
 | 
						|
 | 
						|
            foreach (var sample in samples)
 | 
						|
            {
 | 
						|
                var sampleName = sample.Name();
 | 
						|
 | 
						|
                var originalWidth = _console.Profile.Width;
 | 
						|
                var originalHeight = _console.Profile.Height;
 | 
						|
 | 
						|
                _console.Profile.Encoding = Encoding.UTF8;
 | 
						|
                _console.Profile.Width = sample.ConsoleSize.Cols;
 | 
						|
                _console.Profile.Height = sample.ConsoleSize.Rows;
 | 
						|
 | 
						|
                foreach (var (capabilityName, action) in sample.GetCapabilities())
 | 
						|
                {
 | 
						|
                    action(_console.Profile.Capabilities);
 | 
						|
                    sample.Run(_console);
 | 
						|
                    var json = recorder.GetCastJson($"{sampleName} ({capabilityName})", sample.ConsoleSize.Cols + 2, sample.ConsoleSize.Rows);
 | 
						|
                    File.WriteAllText(Path.Combine(settings.OutputPath, $"{sampleName}-{capabilityName}.cast"), json);
 | 
						|
                }
 | 
						|
 | 
						|
                _console.Profile.Width = originalWidth;
 | 
						|
                _console.Profile.Height = originalHeight;
 | 
						|
            }
 | 
						|
 | 
						|
            return 0;
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |