using System.Reflection; using System.Text; namespace SessionZero.Data; public class SzfGenerator { private readonly SzfGeneratorOptions _options; public SzfGenerator(SzfGeneratorOptions? options = null) { _options = options ?? new SzfGeneratorOptions(); } /// /// Generate SZF content from any SzfObject /// public string Generate(SzfObject obj) { var builder = new StringBuilder(); var writer = new SzfFieldWriter(builder, _options); // Generate header GenerateHeader(writer, obj); // Generate metadata section GenerateMetadataSection(writer, obj); // Generate type-specific content GenerateTypeSpecificContent(writer, obj); return builder.ToString(); } /// /// Generate the SZF header (!type: and !schema:) /// private void GenerateHeader(SzfFieldWriter writer, SzfObject obj) { var type = obj.GetType(); var attribute = type.GetCustomAttribute(); if (attribute == null) { throw new SzfGenerateException( $"Type {type.Name} does not have SzfObjectAttribute, cannot determine type string."); } writer.Builder.AppendLine($"!type: {attribute.TypeString}"); writer.Builder.AppendLine($"!schema: {obj.SchemaVersion}"); writer.Builder.AppendLine(); } /// /// Generate the common metadata section /// private void GenerateMetadataSection(SzfFieldWriter writer, SzfObject obj) { writer.AppendSectionHeader("Metadata"); // Standard metadata fields writer.WriteField("Name", "text", obj.Name); writer.WriteField("Version", "text", obj.Version); writer.WriteField("GUID", "text", obj.Id.ToString()); writer.WriteField("Description", "text-field", obj.Description); writer.WriteField("Author", "text", obj.Author); // Type-specific metadata delegated to the object itself obj.GenerateMetadata(writer); writer.AppendLine(); } /// /// Generate type-specific content sections delegated to the object itself /// private void GenerateTypeSpecificContent(SzfFieldWriter writer, SzfObject obj) { obj.GenerateContent(writer); } } /// /// Configuration options for SZF generation /// public class SzfGeneratorOptions { /// /// Whether to indent field lines within sections /// public bool IndentFields { get; set; } = false; /// /// Indent string to use for fields (if IndentFields is true) /// public string Indent { get; set; } = " "; /// /// Whether to include empty sections /// public bool IncludeEmptySections { get; set; } = false; /// /// Whether to include fields with null/empty values /// public bool IncludeEmptyFields { get; set; } = true; } /// /// Exception thrown during SZF generation /// public class SzfGenerateException : Exception { public SzfGenerateException(string message) : base(message) { } public SzfGenerateException(string message, Exception innerException) : base(message, innerException) { } }