diff --git a/SzCli/Logger.cs b/SzCli/Logger.cs index 5090ff2..79fae18 100644 --- a/SzCli/Logger.cs +++ b/SzCli/Logger.cs @@ -8,38 +8,43 @@ public class Logger : ISzLogger public bool LogToFile { get; set; } = true; public string LogFilePath { get; set; } 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) { - Console.WriteLine($"{DateTime.UtcNow} : [SZ LOG] {text}"); - if (LogToFile) AppendLogFile($"{DateTime.UtcNow} : [SZ LOG] {text}"); + Console.WriteLine($"[SZ LOG] {text}"); + AppendLogFile($"{DateTime.UtcNow} : [SZ LOG] {text}"); } public void LogError(string text) { - Console.WriteLine($"{DateTime.UtcNow} : [SZ ERR] {text}"); - if (LogToFile) AppendLogFile($"{DateTime.UtcNow} : [SZ ERR] {text}"); + Console.WriteLine($"[SZ ERR] {text}"); + AppendLogFile($"{DateTime.UtcNow} : [SZ ERR] {text}"); } public void LogWarning(string text) { - Console.WriteLine($"{DateTime.UtcNow} : [SZ WARN] {text}"); - if (LogToFile) AppendLogFile($"{DateTime.UtcNow} : [SZ WARN] {text}"); + Console.WriteLine($"[SZ WARN] {text}"); + AppendLogFile($"{DateTime.UtcNow} : [SZ WARN] {text}"); } private void AppendLogFile(string text) { // TODO: Make sure log file adheres to LogFileMaxLines - - if (!File.Exists(LogFilePath)) - { - LogFilePath = Path.Combine(SZ.LocalFileManager.DataPath, "log.txt"); - AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) => - { - LogError($"[EXCEPTION] {eventArgs.Exception}"); - }; - } - + if (!LogToFile) return; File.AppendAllText(LogFilePath, text + "\n"); } } \ No newline at end of file diff --git a/SzCli/Program.cs b/SzCli/Program.cs index 470ae59..fcbc7c5 100644 --- a/SzCli/Program.cs +++ b/SzCli/Program.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Threading.Tasks; using SzCore; using SzCore.DataObjects; using SzCore.Defaults; @@ -8,11 +10,12 @@ namespace SzCli; public class Program { 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 SzEvaluator Evaluator = new(); private static SzDataHandler _dataHandler; - public static void Main(string[] args) + public static async Task Main(string[] args) { SZ.Init(FileManager, Logger, DbHandler); _dataHandler = SZ.DataHandler; @@ -32,21 +35,21 @@ public class Program switch (Console.ReadLine()) { - case "1": HandleCreateTemplate(); break; - case "2": HandleDeleteTemplate(); break; - case "3": HandleCreateDataset(); break; - case "4": HandleDeleteDataset(); break; + case "1": await HandleCreateTemplate(); break; + case "2": await HandleDeleteTemplate(); break; + case "3": await HandleCreateDataset(); break; + case "4": await HandleDeleteDataset(); break; case "5": running = false; break; default: Console.WriteLine("Invalid option."); break; } } } - private static void HandleCreateTemplate() + private static async Task HandleCreateTemplate() { Console.Write("Enter Template Name: "); string name = Console.ReadLine() ?? ""; - Console.Write("Enter Data Object Type (e.g., Item, Character): "); + Console.Write("Enter Data Object Type: "); string type = Console.ReadLine() ?? ""; var fields = new List(); @@ -59,7 +62,6 @@ public class Program Console.Write(" Field ID: "); string fId = Console.ReadLine() ?? ""; - // Display Enum Options Console.WriteLine(" Select Field Type:"); var types = Enum.GetValues(); for (int i = 0; i < types.Length; i++) @@ -70,63 +72,54 @@ public class Program Console.Write(" Enter number: "); if (!int.TryParse(Console.ReadLine(), out int choice) || choice < 0 || choice >= types.Length) { - Console.WriteLine(" Invalid selection. Defaulting to Text."); - choice = 0; // Default to Text + choice = 0; } - SzFieldType selectedType = types[choice]; - - var fieldResult = _dataHandler.CreateTemplateField(fId, selectedType); + var fieldResult = _dataHandler.CreateTemplateField(fId, types[choice]); if (fieldResult.IsSuccess) { 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); if (result.IsSuccess) { - _dataHandler.SaveTemplate(result.Value); - Console.WriteLine($"\nTemplate '{result.Value.Id}' saved successfully!"); + await _dataHandler.SaveTemplateAsync(result.Value); + Console.WriteLine($"\nTemplate '{result.Value.Id}' saved!"); } } - private static void HandleDeleteTemplate() + private static async Task HandleDeleteTemplate() { Console.Write("Enter Template ID to delete: "); string id = Console.ReadLine() ?? ""; - var result = _dataHandler.DeleteTemplate(id); + var result = await _dataHandler.DeleteTemplateAsync(id); Console.WriteLine(result.IsSuccess ? "Deleted." : $"Error: {result.Error}"); } - private static void HandleCreateDataset() + private static async Task HandleCreateDataset() { Console.Write("Enter Dataset Name: "); string name = Console.ReadLine() ?? ""; Console.Write("Enter Template ID to use: "); string tId = Console.ReadLine() ?? ""; - var templateResult = _dataHandler.LoadTemplate(tId); + var templateResult = await _dataHandler.LoadTemplateAsync(tId); if (!templateResult.IsSuccess) { Console.WriteLine($"Error: {templateResult.Error}"); return; } - var datasetResult = _dataHandler.CreateDataset(name, tId); + var datasetResult = await _dataHandler.CreateDatasetAsync(name, tId); if (!datasetResult.IsSuccess) return; var dataset = datasetResult.Value; - bool addingObjects = true; - - while (addingObjects) + + while (true) { - Console.Write("Add a DataObject to this dataset? (y/n): "); + Console.Write("Add a DataObject? (y/n): "); if (Console.ReadLine()?.ToLower() != "y") break; Console.Write(" Object Name: "); @@ -137,24 +130,33 @@ public class Program { 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() ?? ""; } - // Assume SzDataset has a way to hold these objects in your actual implementation 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!"); } - private static void HandleDeleteDataset() + private static async Task HandleDeleteDataset() { Console.Write("Enter Dataset ID to delete: "); string id = Console.ReadLine() ?? ""; - var result = _dataHandler.DeleteDataset(id); + var result = await _dataHandler.DeleteDatasetAsync(id); Console.WriteLine(result.IsSuccess ? "Deleted." : $"Error: {result.Error}"); } } \ No newline at end of file diff --git a/SzCli/Test.cs b/SzCli/Test.cs index 4bf28ff..282764e 100644 --- a/SzCli/Test.cs +++ b/SzCli/Test.cs @@ -5,64 +5,64 @@ namespace SzCli; public static class Test { - public static void CreateTestData() - { + // public static void CreateTestData() + // { - SZ.Logger.Log(" -- CreateTestData Test --"); + // SZ.Logger.Log(" -- CreateTestData Test --"); - try - { - var dt = new SzDataObjectTemplate(){ - Name = "SzCore - Basic Item", - Id = "szcore-item-basic", - DataObjectType = "item", - Uuid = Guid.NewGuid() - }; + // try + // { + // var dt = new SzDataObjectTemplate(){ + // Name = "SzCore - Basic Item", + // Id = "szcore-item-basic", + // DataObjectType = "item", + // Uuid = Guid.NewGuid() + // }; - var testTemplateField = new SzTemplateField() - { - Id = "cost", - FieldType = SzFieldType.Number, - DefaultValue = "20" - }; + // var testTemplateField = new SzTemplateField() + // { + // Id = "cost", + // FieldType = SzFieldType.Number, + // 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() - { - Name = "TestDataset", - Id = "test-dataset", - DataObjectTemplateId = dt.Id, - DataObjectTemplateUuid = dt.Uuid, - DataObjectType = "item", - Uuid = Guid.NewGuid(), - }; + // var ds = new SzDataset() + // { + // Name = "TestDataset", + // Id = "test-dataset", + // DataObjectTemplateId = dt.Id, + // DataObjectTemplateUuid = dt.Uuid, + // DataObjectType = "item", + // Uuid = Guid.NewGuid(), + // }; - var testDataObject = new SzDataObject() - { - Name = "TestObject", - Id = "test", - }; + // var testDataObject = new SzDataObject() + // { + // Name = "TestObject", + // Id = "test", + // }; - var testField = new SzField() - { - Id = "cost", - FieldType = SzFieldType.Number, - Value = "200" - }; + // var testField = new SzField() + // { + // Id = "cost", + // FieldType = SzFieldType.Number, + // Value = "200" + // }; - testDataObject.Fields.Add(testField.Id, testField); - ds.DataObjects.Add(testDataObject.Id, testDataObject); + // testDataObject.Fields.Add(testField.Id, testField); + // ds.DataObjects.Add(testDataObject.Id, testDataObject); - SZ.DataHandler.SaveDataset(ds); - } - catch (Exception e) - { - SZ.Logger.LogError($"CreateTestData test failed: {e}"); - } + // SZ.DataHandler.SaveDataset(ds); + // } + // catch (Exception e) + // { + // SZ.Logger.LogError($"CreateTestData test failed: {e}"); + // } - SZ.Logger.Log(" -- CreateTestData Test: Success --"); - } + // SZ.Logger.Log(" -- CreateTestData Test: Success --"); + // } } diff --git a/SzCore/Defaults/DefaultDatabaseHandler.cs b/SzCore/Defaults/DefaultDatabaseHandler.cs index 1dfac19..06b7dec 100644 --- a/SzCore/Defaults/DefaultDatabaseHandler.cs +++ b/SzCore/Defaults/DefaultDatabaseHandler.cs @@ -7,27 +7,13 @@ public class DefaultDatabaseHandler : ISzDatabaseHandler public bool InternetAllowed { get; set; } = true; public Dictionary SzDbUrls { get; set; } = []; - public SzDataset? TryRetrieveDataset(Guid uuid) + public Task TryRetrieveDatasetAsync(Guid uuid, CancellationToken ct = default) { - SZ.Logger.LogWarning("The default database helper is not implemented yet"); - return null; + throw new NotImplementedException(); } - public Task TryRetrieveDatasetAsync(Guid uuid) + public Task TryRetrieveTemplateAsync(Guid uuid, CancellationToken ct = default) { - SZ.Logger.LogWarning("The default database helper is not implemented yet"); - return null; - } - - public ISzTemplate? TryRetrieveTemplate(Guid uuid) - { - SZ.Logger.LogWarning("The default database helper is not implemented yet"); - return null; - } - - public Task TryRetrieveTemplateAsync(Guid uuid) - { - SZ.Logger.LogWarning("The default database helper is not implemented yet"); - return null; + throw new NotImplementedException(); } } \ No newline at end of file diff --git a/SzCore/SzDataHandler.cs b/SzCore/SzDataHandler.cs index f64ee2c..902536a 100644 --- a/SzCore/SzDataHandler.cs +++ b/SzCore/SzDataHandler.cs @@ -9,13 +9,13 @@ public class SzDataHandler public SzDataHandler() { } - private void ClearCache() + public void ClearCache() { _loadedDatasets.Clear(); _loadedTemplates.Clear(); } - #region Datasets (Async) + #region Datasets public async Task> SaveDatasetAsync(SzDataset dataset, CancellationToken ct = default) { var datasetPath = Path.Combine(SZ.LocalFileManager.DatasetsPath, dataset.Id, "dataset.json"); @@ -90,7 +90,7 @@ public class SzDataHandler } #endregion - #region Templates (Async) + #region Templates public async Task> SaveTemplateAsync(ISzTemplate template, CancellationToken ct = default) { var templatePath = Path.Combine(SZ.LocalFileManager.TemplatesPath, template.Id, "template.json"); @@ -122,10 +122,41 @@ public class SzDataHandler _loadedTemplates.TryAdd(parsed.Id, parsed); return SzResult.Success(parsed); } + + public async Task> 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.Success(true); + } + catch (Exception e) + { + return SzResult.Failure(e.Message); + } + }); + } #endregion - #region Synchronous Logic - // These remain synchronous because they are purely in-memory operations. + #region Synchronous Creation Logic + public SzResult CreateTemplateField(string id, SzFieldType fieldType, bool isList = false, string? defaultValue = null, bool isSpecialType = false, string? specialTypeValue = null) + { + if (string.IsNullOrEmpty(id)) return SzResult.Failure("ID cannot be empty."); + + return SzResult.Success(new SzTemplateField() + { + Id = id, + FieldType = fieldType, + IsList = isList, + IsSpecialType = isSpecialType, + DefaultValue = defaultValue ?? "", + SpecialTypeValue = specialTypeValue ?? "" + }); + } + public SzResult CreateDataObjectTemplate(string name, string dataObjectType, string? id = null, string? description = null, List? fields = null) { var newTemplate = new SzDataObjectTemplate()