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)
{
}
}