core services and tests

This commit is contained in:
2026-06-26 18:06:36 +09:00
parent e0508324e5
commit 1e6bf702bc
12 changed files with 675 additions and 8 deletions
@@ -0,0 +1,62 @@
using System.Text.Json;
namespace QuantEngine.Core.Infrastructure
{
public sealed class OperationalReportData
{
public string SchemaVersion { get; init; } = "n/a";
public string SourceJson { get; init; } = "n/a";
public string GeneratedAt { get; init; } = "n/a";
public int SectionCount { get; init; }
public List<OperationalReportSection> Sections { get; init; } = new();
}
public sealed record OperationalReportSection(string Name, string Title, string Preview);
public static class OperationalReportLoader
{
public static OperationalReportData Load(string path)
{
if (!File.Exists(path))
{
return new OperationalReportData();
}
using var stream = File.OpenRead(path);
using var doc = JsonDocument.Parse(stream);
var root = doc.RootElement;
var sections = new List<OperationalReportSection>();
if (root.TryGetProperty("sections", out var sectionArray) && sectionArray.ValueKind == JsonValueKind.Array)
{
foreach (var section in sectionArray.EnumerateArray())
{
var name = section.TryGetProperty("name", out var nameProp) ? nameProp.GetString() ?? string.Empty : string.Empty;
var title = section.TryGetProperty("title", out var titleProp) ? titleProp.GetString() ?? string.Empty : string.Empty;
var markdown = section.TryGetProperty("markdown", out var markdownProp) ? markdownProp.GetString() ?? string.Empty : string.Empty;
sections.Add(new OperationalReportSection(name, title, Preview(markdown)));
}
}
return new OperationalReportData
{
SchemaVersion = root.TryGetProperty("schema_version", out var schema) ? schema.GetString() ?? "n/a" : "n/a",
SourceJson = root.TryGetProperty("source_json", out var sourceJson) ? sourceJson.GetString() ?? "n/a" : "n/a",
GeneratedAt = root.TryGetProperty("generated_at", out var generatedAt) ? generatedAt.GetString() ?? "n/a" : "n/a",
SectionCount = root.TryGetProperty("section_count", out var count) ? count.GetInt32() : sections.Count,
Sections = sections
};
}
private static string Preview(string markdown)
{
if (string.IsNullOrWhiteSpace(markdown))
{
return "n/a";
}
var trimmed = markdown.Replace("\r", " ").Replace("\n", " ").Trim();
return trimmed.Length <= 80 ? trimmed : trimmed[..80] + "...";
}
}
}