// SzfObject.cs using System; using System.Collections.Generic; namespace SessionZero.Data; public abstract class SzfObject { public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = string.Empty; public string Version { get; set; } = "1.0.0"; public string Description { get; set; } = string.Empty; public string Author { get; set; } = string.Empty; public DateTime CreatedDate { get; set; } = DateTime.UtcNow; public DateTime ModifiedDate { get; set; } = DateTime.UtcNow; public string SchemaVersion { get; set; } = "1.0.0"; public Dictionary ExtendedMetadata { get; set; } = new(); public abstract SzfObjectType ObjectType { get; } /// /// Abstract method for SzfObjects to parse their specific sections from the raw parsed structure. /// This promotes separation of concerns by moving type-specific parsing logic into the SzfObject itself. /// /// A list of all parsed sections from the SZF file. public abstract void ParseSections(List sections); /// /// Virtual method for SzfObjects to generate their specific metadata fields. /// Override this in derived classes to add custom metadata to the [Metadata] section. /// /// The SzfFieldWriter instance to write fields. public virtual void GenerateMetadata(SzfFieldWriter writer) { // Default implementation does nothing, derived classes can override. } /// /// Virtual method for SzfObjects to generate their specific content sections. /// Override this in derived classes to add custom sections and fields. /// /// The SzfFieldWriter instance to write fields and manage sections. public virtual void GenerateContent(SzfFieldWriter writer) { // Default implementation does nothing, derived classes can override. } public virtual SzfValidationResult Validate() { var result = new SzfValidationResult { IsValid = true }; if (string.IsNullOrWhiteSpace(Name)) result.AddError("Name is required"); if (Id == Guid.Empty) result.AddError("Valid GUID is required"); if (!IsValidSemanticVersion(Version)) result.AddError($"Invalid version format: {Version}"); return result; } /// /// Parse SZF content and auto-detect the type /// public static SzfObject ParseFromSzf(string szfContent) { var parser = new SzfParser(); return parser.Parse(szfContent); } /// /// Parse SZF content into a specific type /// public static T ParseFromSzf(string szfContent) where T : SzfObject { var parser = new SzfParser(); return parser.Parse(szfContent); } public virtual string ToSzfString() { var generator = new SzfGenerator(); return generator.Generate(this); } public virtual void PopulateFromMetadata(Dictionary metadata) { if (metadata.TryGetValue("Name", out var nameField)) Name = nameField.Value?.ToString() ?? string.Empty; if (metadata.TryGetValue("Version", out var versionField)) Version = versionField.Value?.ToString() ?? "1.0.0"; if (metadata.TryGetValue("GUID", out var guidField) && Guid.TryParse(guidField.Value?.ToString(), out var guid)) Id = guid; if (metadata.TryGetValue("Author", out var authorField)) Author = authorField.Value?.ToString() ?? string.Empty; if (metadata.TryGetValue("Description", out var descField)) Description = descField.Value?.ToString() ?? string.Empty; } private static bool IsValidSemanticVersion(string version) { return System.Text.RegularExpressions.Regex.IsMatch( version, @"^\d+\.\d+\.\d+$"); } } public enum SzfObjectType { Dataset, CharacterTemplate, Character, Session } public class SzfValidationResult { public bool IsValid { get; set; } = true; public List Errors { get; set; } = []; public List Warnings { get; set; } = []; public void AddError(string error) { Errors.Add(error); IsValid = false; } public void AddWarning(string warning) { Warnings.Add(warning); } } public class SzfField { public string Name { get; set; } = string.Empty; public string Type { get; set; } = string.Empty; public object? Value { get; set; } }