115 lines
3.3 KiB
C#
115 lines
3.3 KiB
C#
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<string, object> ExtendedMetadata { get; set; } = new();
|
|
|
|
public abstract SzfObjectType ObjectType { get; }
|
|
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Parse SZF content and auto-detect the type
|
|
/// </summary>
|
|
public static SzfObject ParseFromSzf(string szfContent)
|
|
{
|
|
var parser = new SzfParser();
|
|
return parser.Parse(szfContent);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Parse SZF content into a specific type
|
|
/// </summary>
|
|
public static T ParseFromSzf<T>(string szfContent) where T : SzfObject
|
|
{
|
|
var parser = new SzfParser();
|
|
return parser.Parse<T>(szfContent);
|
|
}
|
|
|
|
public virtual string ToSzfString()
|
|
{
|
|
var generator = new SzfGenerator();
|
|
return generator.Generate(this);
|
|
}
|
|
|
|
public virtual void PopulateFromMetadata(Dictionary<string, SzfField> 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<string> Errors { get; set; } = [];
|
|
public List<string> 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; }
|
|
} |