using System; using System.IO; using System.Linq; using Dinah.Core; using FileManager; using Newtonsoft.Json.Linq; #nullable enable namespace LibationFileManager { public partial class Configuration : PropertyChangeFilter { /// /// Returns true if exists and the property has a non-null, non-empty value. /// Does not verify the existence of the directory. /// public bool LibationSettingsAreValid => SettingsFileIsValid(SettingsFilePath); /// /// Returns true if exists and the property has a non-null, non-empty value. /// Does not verify the existence of the directory. /// /// File path to the settings JSON file public static bool SettingsFileIsValid(string settingsFile) { if (!Directory.Exists(Path.GetDirectoryName(settingsFile)) || !File.Exists(settingsFile)) return false; try { var settingsJson = JObject.Parse(File.ReadAllText(settingsFile)); return !string.IsNullOrWhiteSpace(settingsJson[nameof(Books)]?.Value()); } catch (Exception ex) { Serilog.Log.Logger.Error(ex, "Failed to load settings file: {@SettingsFile}", settingsFile); try { Serilog.Log.Logger.Information("Deleting invalid settings file: {@SettingsFile}", settingsFile); FileUtility.SaferDelete(settingsFile); Serilog.Log.Logger.Information("Creating a new, empty setting file: {@SettingsFile}", settingsFile); try { File.WriteAllText(settingsFile, "{}"); } catch (Exception createEx) { Serilog.Log.Logger.Error(createEx, "Failed to create new settings file: {@SettingsFile}", settingsFile); } } catch (Exception deleteEx) { Serilog.Log.Logger.Error(deleteEx, "Failed to delete the invalid settings file: {@SettingsFile}", settingsFile); } return false; } } #region singleton stuff public static Configuration Instance { get; } = new Configuration(); private Configuration() { } #endregion } }