Converting to Async

This commit is contained in:
2026-01-29 20:22:30 -06:00
parent 0dd597ee4e
commit 30236924a0
5 changed files with 148 additions and 124 deletions

View File

@@ -8,38 +8,43 @@ public class Logger : ISzLogger
public bool LogToFile { get; set; } = true; public bool LogToFile { get; set; } = true;
public string LogFilePath { get; set; } public string LogFilePath { get; set; }
public int LogFileMaxLines { get; set; } = 100; public int LogFileMaxLines { get; set; } = 100;
public readonly ISzFileManager FileManager;
public Logger(ISzFileManager fileManager)
{
FileManager = fileManager;
LogFilePath = Path.Combine(FileManager.DataPath, "log.txt");
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
LogError($"[EXCEPTION] {eventArgs.Exception}");
};
}
public void Log(string text) public void Log(string text)
{ {
Console.WriteLine($"{DateTime.UtcNow} : [SZ LOG] {text}"); Console.WriteLine($"[SZ LOG] {text}");
if (LogToFile) AppendLogFile($"{DateTime.UtcNow} : [SZ LOG] {text}"); AppendLogFile($"{DateTime.UtcNow} : [SZ LOG] {text}");
} }
public void LogError(string text) public void LogError(string text)
{ {
Console.WriteLine($"{DateTime.UtcNow} : [SZ ERR] {text}"); Console.WriteLine($"[SZ ERR] {text}");
if (LogToFile) AppendLogFile($"{DateTime.UtcNow} : [SZ ERR] {text}"); AppendLogFile($"{DateTime.UtcNow} : [SZ ERR] {text}");
} }
public void LogWarning(string text) public void LogWarning(string text)
{ {
Console.WriteLine($"{DateTime.UtcNow} : [SZ WARN] {text}"); Console.WriteLine($"[SZ WARN] {text}");
if (LogToFile) AppendLogFile($"{DateTime.UtcNow} : [SZ WARN] {text}"); AppendLogFile($"{DateTime.UtcNow} : [SZ WARN] {text}");
} }
private void AppendLogFile(string text) private void AppendLogFile(string text)
{ {
// TODO: Make sure log file adheres to LogFileMaxLines // TODO: Make sure log file adheres to LogFileMaxLines
if (!LogToFile) return;
if (!File.Exists(LogFilePath))
{
LogFilePath = Path.Combine(SZ.LocalFileManager.DataPath, "log.txt");
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
LogError($"[EXCEPTION] {eventArgs.Exception}");
};
}
File.AppendAllText(LogFilePath, text + "\n"); File.AppendAllText(LogFilePath, text + "\n");
} }
} }

View File

@@ -1,4 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using SzCore; using SzCore;
using SzCore.DataObjects; using SzCore.DataObjects;
using SzCore.Defaults; using SzCore.Defaults;
@@ -8,11 +10,12 @@ namespace SzCli;
public class Program public class Program
{ {
private static readonly DefaultLocalFileManager FileManager = new(); private static readonly DefaultLocalFileManager FileManager = new();
private static readonly Logger Logger = new(); private static readonly Logger Logger = new(FileManager);
private static readonly DefaultDatabaseHandler DbHandler = new(); private static readonly DefaultDatabaseHandler DbHandler = new();
private static readonly SzEvaluator Evaluator = new();
private static SzDataHandler _dataHandler; private static SzDataHandler _dataHandler;
public static void Main(string[] args) public static async Task Main(string[] args)
{ {
SZ.Init(FileManager, Logger, DbHandler); SZ.Init(FileManager, Logger, DbHandler);
_dataHandler = SZ.DataHandler; _dataHandler = SZ.DataHandler;
@@ -32,21 +35,21 @@ public class Program
switch (Console.ReadLine()) switch (Console.ReadLine())
{ {
case "1": HandleCreateTemplate(); break; case "1": await HandleCreateTemplate(); break;
case "2": HandleDeleteTemplate(); break; case "2": await HandleDeleteTemplate(); break;
case "3": HandleCreateDataset(); break; case "3": await HandleCreateDataset(); break;
case "4": HandleDeleteDataset(); break; case "4": await HandleDeleteDataset(); break;
case "5": running = false; break; case "5": running = false; break;
default: Console.WriteLine("Invalid option."); break; default: Console.WriteLine("Invalid option."); break;
} }
} }
} }
private static void HandleCreateTemplate() private static async Task HandleCreateTemplate()
{ {
Console.Write("Enter Template Name: "); Console.Write("Enter Template Name: ");
string name = Console.ReadLine() ?? ""; string name = Console.ReadLine() ?? "";
Console.Write("Enter Data Object Type (e.g., Item, Character): "); Console.Write("Enter Data Object Type: ");
string type = Console.ReadLine() ?? ""; string type = Console.ReadLine() ?? "";
var fields = new List<SzTemplateField>(); var fields = new List<SzTemplateField>();
@@ -59,7 +62,6 @@ public class Program
Console.Write(" Field ID: "); Console.Write(" Field ID: ");
string fId = Console.ReadLine() ?? ""; string fId = Console.ReadLine() ?? "";
// Display Enum Options
Console.WriteLine(" Select Field Type:"); Console.WriteLine(" Select Field Type:");
var types = Enum.GetValues<SzFieldType>(); var types = Enum.GetValues<SzFieldType>();
for (int i = 0; i < types.Length; i++) for (int i = 0; i < types.Length; i++)
@@ -70,63 +72,54 @@ public class Program
Console.Write(" Enter number: "); Console.Write(" Enter number: ");
if (!int.TryParse(Console.ReadLine(), out int choice) || choice < 0 || choice >= types.Length) if (!int.TryParse(Console.ReadLine(), out int choice) || choice < 0 || choice >= types.Length)
{ {
Console.WriteLine(" Invalid selection. Defaulting to Text."); choice = 0;
choice = 0; // Default to Text
} }
SzFieldType selectedType = types[choice]; var fieldResult = _dataHandler.CreateTemplateField(fId, types[choice]);
var fieldResult = _dataHandler.CreateTemplateField(fId, selectedType);
if (fieldResult.IsSuccess) if (fieldResult.IsSuccess)
{ {
fields.Add(fieldResult.Value); fields.Add(fieldResult.Value);
Console.WriteLine($" Added {selectedType} field: {fId}");
}
else
{
Console.WriteLine($" Error creating field: {fieldResult.Error}");
} }
} }
var result = _dataHandler.CreateDataObjectTemplate(name, type, fields: fields); var result = _dataHandler.CreateDataObjectTemplate(name, type, fields: fields);
if (result.IsSuccess) if (result.IsSuccess)
{ {
_dataHandler.SaveTemplate(result.Value); await _dataHandler.SaveTemplateAsync(result.Value);
Console.WriteLine($"\nTemplate '{result.Value.Id}' saved successfully!"); Console.WriteLine($"\nTemplate '{result.Value.Id}' saved!");
} }
} }
private static void HandleDeleteTemplate() private static async Task HandleDeleteTemplate()
{ {
Console.Write("Enter Template ID to delete: "); Console.Write("Enter Template ID to delete: ");
string id = Console.ReadLine() ?? ""; string id = Console.ReadLine() ?? "";
var result = _dataHandler.DeleteTemplate(id); var result = await _dataHandler.DeleteTemplateAsync(id);
Console.WriteLine(result.IsSuccess ? "Deleted." : $"Error: {result.Error}"); Console.WriteLine(result.IsSuccess ? "Deleted." : $"Error: {result.Error}");
} }
private static void HandleCreateDataset() private static async Task HandleCreateDataset()
{ {
Console.Write("Enter Dataset Name: "); Console.Write("Enter Dataset Name: ");
string name = Console.ReadLine() ?? ""; string name = Console.ReadLine() ?? "";
Console.Write("Enter Template ID to use: "); Console.Write("Enter Template ID to use: ");
string tId = Console.ReadLine() ?? ""; string tId = Console.ReadLine() ?? "";
var templateResult = _dataHandler.LoadTemplate<SzDataObjectTemplate>(tId); var templateResult = await _dataHandler.LoadTemplateAsync<SzDataObjectTemplate>(tId);
if (!templateResult.IsSuccess) if (!templateResult.IsSuccess)
{ {
Console.WriteLine($"Error: {templateResult.Error}"); Console.WriteLine($"Error: {templateResult.Error}");
return; return;
} }
var datasetResult = _dataHandler.CreateDataset(name, tId); var datasetResult = await _dataHandler.CreateDatasetAsync(name, tId);
if (!datasetResult.IsSuccess) return; if (!datasetResult.IsSuccess) return;
var dataset = datasetResult.Value; var dataset = datasetResult.Value;
bool addingObjects = true;
while (true)
while (addingObjects)
{ {
Console.Write("Add a DataObject to this dataset? (y/n): "); Console.Write("Add a DataObject? (y/n): ");
if (Console.ReadLine()?.ToLower() != "y") break; if (Console.ReadLine()?.ToLower() != "y") break;
Console.Write(" Object Name: "); Console.Write(" Object Name: ");
@@ -137,24 +130,33 @@ public class Program
{ {
foreach (var field in objResult.Value.Fields.Values) foreach (var field in objResult.Value.Fields.Values)
{ {
Console.Write($" Value for {field.Id}: "); Console.Write($" Value for {field.Id} ({field.FieldType}): ");
field.Value = Console.ReadLine() ?? ""; field.Value = Console.ReadLine() ?? "";
} }
// Assume SzDataset has a way to hold these objects in your actual implementation
dataset.DataObjects.Add(objResult.Value.Id, objResult.Value); dataset.DataObjects.Add(objResult.Value.Id, objResult.Value);
Console.WriteLine(" Object added to dataset draft.");
} }
} }
_dataHandler.SaveDataset(dataset); Console.WriteLine("\nValidating dataset...");
var evalResult = await Evaluator.EvaluateDatasetAsync(dataset);
if (!evalResult.IsSuccess)
{
Console.WriteLine("Validation Failed:");
Console.WriteLine(evalResult.Error);
Console.Write("Save anyway? (y/n): ");
if (Console.ReadLine()?.ToLower() != "y") return;
}
await _dataHandler.SaveDatasetAsync(dataset);
Console.WriteLine("Dataset saved!"); Console.WriteLine("Dataset saved!");
} }
private static void HandleDeleteDataset() private static async Task HandleDeleteDataset()
{ {
Console.Write("Enter Dataset ID to delete: "); Console.Write("Enter Dataset ID to delete: ");
string id = Console.ReadLine() ?? ""; string id = Console.ReadLine() ?? "";
var result = _dataHandler.DeleteDataset(id); var result = await _dataHandler.DeleteDatasetAsync(id);
Console.WriteLine(result.IsSuccess ? "Deleted." : $"Error: {result.Error}"); Console.WriteLine(result.IsSuccess ? "Deleted." : $"Error: {result.Error}");
} }
} }

View File

@@ -5,64 +5,64 @@ namespace SzCli;
public static class Test public static class Test
{ {
public static void CreateTestData() // public static void CreateTestData()
{ // {
SZ.Logger.Log(" -- CreateTestData Test --"); // SZ.Logger.Log(" -- CreateTestData Test --");
try // try
{ // {
var dt = new SzDataObjectTemplate(){ // var dt = new SzDataObjectTemplate(){
Name = "SzCore - Basic Item", // Name = "SzCore - Basic Item",
Id = "szcore-item-basic", // Id = "szcore-item-basic",
DataObjectType = "item", // DataObjectType = "item",
Uuid = Guid.NewGuid() // Uuid = Guid.NewGuid()
}; // };
var testTemplateField = new SzTemplateField() // var testTemplateField = new SzTemplateField()
{ // {
Id = "cost", // Id = "cost",
FieldType = SzFieldType.Number, // FieldType = SzFieldType.Number,
DefaultValue = "20" // DefaultValue = "20"
}; // };
dt.TemplateFields.Add(testTemplateField.Id, testTemplateField); // dt.TemplateFields.Add(testTemplateField.Id, testTemplateField);
SZ.DataHandler.SaveTemplate(dt); // SZ.DataHandler.SaveTemplate(dt);
var ds = new SzDataset() // var ds = new SzDataset()
{ // {
Name = "TestDataset", // Name = "TestDataset",
Id = "test-dataset", // Id = "test-dataset",
DataObjectTemplateId = dt.Id, // DataObjectTemplateId = dt.Id,
DataObjectTemplateUuid = dt.Uuid, // DataObjectTemplateUuid = dt.Uuid,
DataObjectType = "item", // DataObjectType = "item",
Uuid = Guid.NewGuid(), // Uuid = Guid.NewGuid(),
}; // };
var testDataObject = new SzDataObject() // var testDataObject = new SzDataObject()
{ // {
Name = "TestObject", // Name = "TestObject",
Id = "test", // Id = "test",
}; // };
var testField = new SzField() // var testField = new SzField()
{ // {
Id = "cost", // Id = "cost",
FieldType = SzFieldType.Number, // FieldType = SzFieldType.Number,
Value = "200" // Value = "200"
}; // };
testDataObject.Fields.Add(testField.Id, testField); // testDataObject.Fields.Add(testField.Id, testField);
ds.DataObjects.Add(testDataObject.Id, testDataObject); // ds.DataObjects.Add(testDataObject.Id, testDataObject);
SZ.DataHandler.SaveDataset(ds); // SZ.DataHandler.SaveDataset(ds);
} // }
catch (Exception e) // catch (Exception e)
{ // {
SZ.Logger.LogError($"CreateTestData test failed: {e}"); // SZ.Logger.LogError($"CreateTestData test failed: {e}");
} // }
SZ.Logger.Log(" -- CreateTestData Test: Success --"); // SZ.Logger.Log(" -- CreateTestData Test: Success --");
} // }
} }

View File

@@ -7,27 +7,13 @@ public class DefaultDatabaseHandler : ISzDatabaseHandler
public bool InternetAllowed { get; set; } = true; public bool InternetAllowed { get; set; } = true;
public Dictionary<string, string> SzDbUrls { get; set; } = []; public Dictionary<string, string> SzDbUrls { get; set; } = [];
public SzDataset? TryRetrieveDataset(Guid uuid) public Task<SzDataset?> TryRetrieveDatasetAsync(Guid uuid, CancellationToken ct = default)
{ {
SZ.Logger.LogWarning("The default database helper is not implemented yet"); throw new NotImplementedException();
return null;
} }
public Task<SzDataset?> TryRetrieveDatasetAsync(Guid uuid) public Task<ISzTemplate?> TryRetrieveTemplateAsync(Guid uuid, CancellationToken ct = default)
{ {
SZ.Logger.LogWarning("The default database helper is not implemented yet"); throw new NotImplementedException();
return null;
}
public ISzTemplate? TryRetrieveTemplate(Guid uuid)
{
SZ.Logger.LogWarning("The default database helper is not implemented yet");
return null;
}
public Task<ISzTemplate?> TryRetrieveTemplateAsync(Guid uuid)
{
SZ.Logger.LogWarning("The default database helper is not implemented yet");
return null;
} }
} }

View File

@@ -9,13 +9,13 @@ public class SzDataHandler
public SzDataHandler() { } public SzDataHandler() { }
private void ClearCache() public void ClearCache()
{ {
_loadedDatasets.Clear(); _loadedDatasets.Clear();
_loadedTemplates.Clear(); _loadedTemplates.Clear();
} }
#region Datasets (Async) #region Datasets
public async Task<SzResult<bool>> SaveDatasetAsync(SzDataset dataset, CancellationToken ct = default) public async Task<SzResult<bool>> SaveDatasetAsync(SzDataset dataset, CancellationToken ct = default)
{ {
var datasetPath = Path.Combine(SZ.LocalFileManager.DatasetsPath, dataset.Id, "dataset.json"); var datasetPath = Path.Combine(SZ.LocalFileManager.DatasetsPath, dataset.Id, "dataset.json");
@@ -90,7 +90,7 @@ public class SzDataHandler
} }
#endregion #endregion
#region Templates (Async) #region Templates
public async Task<SzResult<bool>> SaveTemplateAsync(ISzTemplate template, CancellationToken ct = default) public async Task<SzResult<bool>> SaveTemplateAsync(ISzTemplate template, CancellationToken ct = default)
{ {
var templatePath = Path.Combine(SZ.LocalFileManager.TemplatesPath, template.Id, "template.json"); var templatePath = Path.Combine(SZ.LocalFileManager.TemplatesPath, template.Id, "template.json");
@@ -122,10 +122,41 @@ public class SzDataHandler
_loadedTemplates.TryAdd(parsed.Id, parsed); _loadedTemplates.TryAdd(parsed.Id, parsed);
return SzResult<T>.Success(parsed); return SzResult<T>.Success(parsed);
} }
public async Task<SzResult<bool>> DeleteTemplateAsync(string templateId)
{
return await Task.Run(() => {
try
{
var path = Path.Combine(SZ.LocalFileManager.TemplatesPath, templateId);
if (Directory.Exists(path)) Directory.Delete(path, true);
_loadedTemplates.Remove(templateId);
return SzResult<bool>.Success(true);
}
catch (Exception e)
{
return SzResult<bool>.Failure(e.Message);
}
});
}
#endregion #endregion
#region Synchronous Logic #region Synchronous Creation Logic
// These remain synchronous because they are purely in-memory operations. public SzResult<SzTemplateField> CreateTemplateField(string id, SzFieldType fieldType, bool isList = false, string? defaultValue = null, bool isSpecialType = false, string? specialTypeValue = null)
{
if (string.IsNullOrEmpty(id)) return SzResult<SzTemplateField>.Failure("ID cannot be empty.");
return SzResult<SzTemplateField>.Success(new SzTemplateField()
{
Id = id,
FieldType = fieldType,
IsList = isList,
IsSpecialType = isSpecialType,
DefaultValue = defaultValue ?? "",
SpecialTypeValue = specialTypeValue ?? ""
});
}
public SzResult<SzDataObjectTemplate> CreateDataObjectTemplate(string name, string dataObjectType, string? id = null, string? description = null, List<SzTemplateField>? fields = null) public SzResult<SzDataObjectTemplate> CreateDataObjectTemplate(string name, string dataObjectType, string? id = null, string? description = null, List<SzTemplateField>? fields = null)
{ {
var newTemplate = new SzDataObjectTemplate() var newTemplate = new SzDataObjectTemplate()