using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Kean.Domain.Order.Models
{
///
/// 单号格式
///
public class Format
{
private readonly IEnumerable _span; // 片段
///
/// 初始化 Kean.Domain.Order.Models.Format 类的新实例
///
/// 片段
public Format(IEnumerable span) => _span = span;
///
/// 隐式转换为字符串
///
/// 格式
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,
};
}));
///
/// 解释片段
///
/// 格式
/// 片段
public static IEnumerable<(string Type, string Value)> Interpret(string format)
{
var span = new Stack();
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();
}
}
}