trim HttpHeaders
石头 编写于 2024-06-22 08:55:23
X
namespace NewLife.Configuration;

/// <summary>命令分析器</summary>
public class CommandParser
{
    /// <summary>不区分大小写</summary>
    public Boolean IgnoreCase { get; set; }

    /// <summary>去除前导横杠。默认true</summary>
    public Boolean TrimStart { get; set; } = true;

    /// <summary>分析参数数组,得到名值字段</summary>
    /// <param name="args"></param>
    /// <returns></returns>
    public IDictionary<String, String> Parse(String[] args)
    {
        args ??= Environment.GetCommandLineArgs();

        var dic = IgnoreCase ?
            new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase) :
            new Dictionary<String, String>();
        for (var i = 0; i < args.Length; i++)
        {
            var key = args[i];

            // 如果key以-开头,说明是参数名,下一个可能是参数值
            if (key[0] == '-')
            {
                // 有=表明是kv结构
                var p = key.IndexOf('=');
                if (p > 0)
                {
                    var value = key.Substring(p + 1);
                    key = key.Substring(0, p);
                    if (TrimStart) key = key.TrimStart('-');
                    dic[key] = TrimQuote(value);
                }
                else
                {
                    // 下一个是值
                    if (TrimStart) key = key.TrimStart('-');
                    var value = (i + 1 < args.Length && args[i + 1][0] != '-') ? args[++i] : null;
                    dic[key] = TrimQuote(value);
                }
            }
            else
            {
                // 下一个是值
                if (TrimStart) key = key.TrimStart('-');
                var value = (i + 1 < args.Length && args[i + 1][0] != '-') ? args[++i] : null;
                dic[key] = TrimQuote(value);
            }
        }

        return dic;
    }

    /// <summary>去除两头的双引号</summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static String TrimQuote(String value)
    {
        if (value.IsNullOrEmpty()) return value;

        if (value[0] == '"' && value[value.Length - 1] == '"') value = value.Substring(1, value.Length - 2);
        if (value[0] == '\'' && value[value.Length - 1] == '\'') value = value.Substring(1, value.Length - 2);

        return value;
    }
}