Commit e4508a58 authored by shrabbit's avatar shrabbit
Browse files

Add B64TextEncoding playground and enhance error handling in Errors class

parent 7836d344
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -23,9 +23,9 @@ public class PlaygroundLauncher(Action onReload)
    /// <param name="args">命令行参数数组,用于检查是否需要显示游乐场列表等。</param>
    public void Startup(string[] args)
    {
        Console.WriteLine($"PlaygroundLauncher: {GetType()}");
        
        Thread.Sleep(2000);
        // Console.WriteLine($"PlaygroundLauncher: {GetType()}");
        //
        // Thread.Sleep(2000);
        try
        {
            AnsiConsole.Clear();
@@ -291,7 +291,7 @@ public class PlaygroundLauncher(Action onReload)
    /// <exception cref="ArgumentException">当添加的游乐场与已有游乐场具有相同的LaunchCmd属性值时抛出。</exception>
    public PlaygroundLauncher Add<TP>() where TP : class, IPlayground, new()
    {
        Console.WriteLine($"<{typeof(TP).FullName}> Loaded");
        // Console.WriteLine($"<{typeof(TP).FullName}> Loaded");
        
        if (_running)
            throw new Exception("无法在运行 Startup() 后添加 Playground.");
+62 −0
Original line number Diff line number Diff line
using System.Text;
using Spectre.Console;
using TestV.Tools;

namespace TestV.Playgrounds.Base64Tool;

public class B64TextEncoding
{
    public class Encoder : IPlayground
    {
        public string LaunchCmd { get; } = "btoa";
        public string? Name { get; } = "String To Base64String";
        public string? Description { get; } = "btoa [Text] <Encoder> <Order> <BOM>\n" +
                                              "  可选编码器:\n" +
                                              "    --u8(UTF-8编解码,默认)、\n" +
                                              "    --u16(UTF-16编解码)。\n" + 
                                              "  可选字节序:\n" + 
                                              "    --le:小端序\n" + 
                                              "    --be:大端序(默认)\n" +
                                              "  可选字节序标记:" +
                                              "    --bom:带字节序标记" +
                                              "    不填:不带字节序标记(默认)";
        public Task Run(string[] args)
        {
            if (Errors.ValidArgsLength(args, 1))
            {
                var text = args[0];
                var encoderArg = args.Length > 1 ? args[1].ToLower() : "--u8";
                var orderArg = args.Length > 2 ? args[2].ToLower() : "--be";
                var bomArg = args.Length > 3 ? args[3].ToLower() : string.Empty;

                if (Errors.ValidArrowsArgWithName(encoderArg, "Encoder", "--u8", "--u16") &&
                    Errors.ValidArrowsArgWithName(orderArg, "Order", "--le", "--be") &&
                    Errors.ValidArrowsArgWithName(bomArg, "BOM", "--bom", string.Empty))
                {
                    var isBigEndian = orderArg switch
                    {
                        "--be" => true,
                        _ => false
                    };

                    var isBom = bomArg switch
                    {
                        "--bom" => true,
                        _ => false
                    };
                    
                    Encoding encoder = encoderArg switch
                    {
                        "--u16" => new UnicodeEncoding(isBigEndian, isBom),
                        _ => new UTF8Encoding(isBigEndian, isBom)
                    };

                    AnsiConsole.WriteLine(Convert.ToBase64String(encoder.GetBytes(text)));
                    AnsiConsole.WriteLine();
                }
            }

            return Task.CompletedTask;
        }
    }
}
 No newline at end of file
+13 −11
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ using System.Runtime.Intrinsics.Arm;
using System.Runtime.Intrinsics.X86;
using System.Text;
using TestV.Playgrounds;
using TestV.Playgrounds.Base64Tool;
using TestV.Playgrounds.Ts;

namespace TestV;
@@ -120,17 +121,17 @@ class Program
        var reload = false;
        do
        {
            Console.WriteLine(new string('0', DateTime.Now.Second));
            Console.WriteLine($"TestV -> {Assembly.GetExecutingAssembly().EntryPoint}");
            Console.WriteLine($"{Assembly.GetExecutingAssembly()}");
            Console.WriteLine("shRabbit, 2026/3/28");
            Console.WriteLine(DateTime.Now.ToString("O"));
            Console.WriteLine("0x" + DateTime.Now.Ticks.ToString("x"));
            
            Console.WriteLine(new string('=', 32));
            
            foreach (var t in GetAllTypes())
                Console.WriteLine(t);
            // Console.WriteLine(new string('0', DateTime.Now.Second));
            // Console.WriteLine($"TestV -> {Assembly.GetExecutingAssembly().EntryPoint}");
            // Console.WriteLine($"{Assembly.GetExecutingAssembly()}");
            // Console.WriteLine("shRabbit, 2026/3/28");
            // Console.WriteLine(DateTime.Now.ToString("O"));
            // Console.WriteLine("0x" + DateTime.Now.Ticks.ToString("x"));
            //
            // Console.WriteLine(new string('=', 32));
            //
            // foreach (var t in GetAllTypes())
            //     Console.WriteLine(t);
            
            reload = false;
            
@@ -156,6 +157,7 @@ class Program
                .Add<MemoryAdd>()
                .Add<Ref>()
                .Add<SliInt>()
                .Add<B64TextEncoding.Encoder>()
                .Add<Exp1>();
            
            play.Startup(args);
+43 −1
Original line number Diff line number Diff line
@@ -12,7 +12,49 @@ public class Errors
    public static void NoArgs(int needMinArgs)
    {
        AnsiConsole.MarkupLine("  [red]└ 错误:参数太少。[/]\n" + 
                              $"    [darkred]最少需要 {needMinArgs} 个。[/]\n");
                              $"    [red]最少需要 {needMinArgs} 个。[/]\n");
    }

    public static void NotArrow(ReadOnlySpan<char> argName, params ReadOnlySpan<string> arrowsArg)
    {
        AnsiConsole.MarkupLine($"  [red]└ 错误:参数{argName}不被允许。[/]\n" +
                               $"    [red]可选参数为:{string.Join(", ", arrowsArg)}[/]\n");
    }

    public static void NotArrow(params ReadOnlySpan<string> arrowsArg)
    {
        AnsiConsole.MarkupLine($"  [red]└ 错误:参数不被允许。[/]\n" +
                               $"    [red]可选参数为:{string.Join(", ", arrowsArg)}[/]\n");
    }

    public static bool ValidArgsLength(ReadOnlySpan<string> args, int minArgsLength)
    {
        if (args.Length >= minArgsLength) return true;
        
        NoArgs(minArgsLength);
        return false;
    }

    public static bool ValidArrowsArg(ReadOnlySpan<char> arg, params ReadOnlySpan<string> arrowsArg)
    {
        foreach (var arrow in arrowsArg)
        {
            if (arg.Equals(arrow.AsSpan(), StringComparison.Ordinal)) return true;
        }

        NotArrow(arrowsArg);
        return false;
    }

    public static bool ValidArrowsArgWithName(ReadOnlySpan<char> arg, ReadOnlySpan<char> argName, params ReadOnlySpan<string> arrowsArg)
    {
        foreach (var arrow in arrowsArg)
        {
            if (arg.Equals(arrow.AsSpan(), StringComparison.Ordinal)) return true;
        }

        NotArrow(argName, arrowsArg);
        return false;
    }
}