using System.Text; using System.Text.Encodings.Web; using System.Text.Json; namespace AIStudio.Assistants.VisualBriefing; /// /// Compiles interaction state and safe declarative controls. /// internal static class VisualBriefingInteractionCompiler { /// /// Compiles controls and formulas into deterministic runtime state. /// /// The validated interaction controls. /// The validated formula specifications. /// The declarative interaction data. internal static JsonElement Compile(IReadOnlyList controls, IReadOnlyList formulas) { var state = controls.ToDictionary( control => control.ControlId, control => control.InitialValue.Clone(), StringComparer.Ordinal); var formulaMap = formulas.ToDictionary( formula => formula.OutputSlotId, formula => formula.Formula, StringComparer.Ordinal); return JsonSerializer.SerializeToElement(new { controls, state, formulas = formulaMap, }, VisualBriefingJson.Canonical); } /// /// Compiles safe control markup for one component. /// /// The owning component identifier. /// All validated briefing controls. /// The declarative control markup. internal static string CompileMarkup(string componentId, IReadOnlyList controls) { var builder = new StringBuilder(); foreach (var indexed in controls.Select((control, index) => (Control: control, Index: index)).Where(item => item.Control.ComponentId == componentId)) { var control = indexed.Control; var id = HtmlEncoder.Default.Encode(control.ControlId); var accessibilityPath = $"accessibility.{HtmlEncoder.Default.Encode(componentId)}"; builder.Append(control.Kind switch { VisualBriefingControlKind.SELECT or VisualBriefingControlKind.FILTER => $"", VisualBriefingControlKind.RANGE => $"", VisualBriefingControlKind.NUMBER => $"", _ => string.Empty, }); } return builder.ToString(); } /// /// Compiles a deterministic reset action for one simulation component. /// /// The simulation component identifier. /// The declarative reset button markup. internal static string CompileResetMarkup(string componentId) => $""; }