山东雷驰
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.8 KiB

3 months ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Kean.Domain.Order.Models
{
/// <summary>
/// 单号格式
/// </summary>
public class Format
{
private readonly IEnumerable<string> _span; // 片段
/// <summary>
/// 初始化 Kean.Domain.Order.Models.Format 类的新实例
/// </summary>
/// <param name="span">片段</param>
public Format(IEnumerable<string> span) => _span = span;
/// <summary>
/// 隐式转换为字符串
/// </summary>
/// <param name="format">格式</param>
public static implicit operator string(Format format) => format.ToString();
/*
* System.ToString
*/
public override string ToString() => string.Join(string.Empty, _span.Select(i =>
{
var parts = i.Split(':', 2);
return parts[0] switch
{
"const" => parts[1],
"date" or "serial" => $"{{{parts[0]}:{parts[1]}}}",
_ => null,
};
}));
/// <summary>
/// 解释片段
/// </summary>
/// <param name="format">格式</param>
/// <returns>片段</returns>
public static IEnumerable<(string Type, string Value)> Interpret(string format)
{
var span = new Stack<StringBuilder[]>();
bool? flag = null;
foreach (var @char in format)
{
switch (@char)
{
case '{':
span.Push(new StringBuilder[2] { new(), new() });
flag = false;
break;
case ':':
flag = true;
break;
case '}':
flag = null;
break;
default:
switch (flag)
{
case false:
span.Peek()[0].Append(@char);
break;
case true:
span.Peek()[1].Append(@char);
break;
case null:
span.Push(new StringBuilder[2] { new("const"), new(@char.ToString()) });
flag = true;
break;
}
break;
}
}
return span
.Reverse()
.Select(a => (a[0].ToString(), a[1].ToString()))
.ToArray();
}
}
}