namespace WxAgent.Core; public sealed record WechatSessionSnapshot(string Name, string AutomationId, bool IsCurrent); public sealed record WechatSessionSearchResult(string Name, string AutomationId, string? Category, bool IsExactMatch); public static class WechatSessionParser { public static IReadOnlyList Parse( IEnumerable<(string AutomationId, string Name)> elements, string? currentName) { return elements .Where(element => element.AutomationId.StartsWith("session_item_", StringComparison.Ordinal) && !string.IsNullOrWhiteSpace(element.Name)) .DistinctBy(element => element.AutomationId, StringComparer.Ordinal) .Select(element => { var name = element.Name.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).FirstOrDefault() ?? element.Name; return new WechatSessionSnapshot(name, element.AutomationId, string.Equals(name, currentName, StringComparison.Ordinal)); }) .ToArray(); } public static IReadOnlyList ParseSearchResults( IEnumerable<(string AutomationId, string AccessibleName)> elements, string query) { ArgumentException.ThrowIfNullOrWhiteSpace(query); return elements .Where(element => element.AutomationId.StartsWith("search_item_", StringComparison.Ordinal) && !string.IsNullOrWhiteSpace(element.AccessibleName)) .DistinctBy(element => element.AutomationId, StringComparer.Ordinal) .Select(element => { var lines = element.AccessibleName.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); var exact = lines.FirstOrDefault(line => string.Equals(line, query, StringComparison.Ordinal)); var name = exact ?? lines.Last(); var category = lines.Length > 1 && !string.Equals(lines[0], name, StringComparison.Ordinal) ? lines[0] : null; return new WechatSessionSearchResult(name, element.AutomationId, category, exact is not null); }) .ToArray(); } }