using Swan.Formatters;
using System;
using System.IO;
namespace Swan.Configuration
{
///
/// Represents a provider to save and load settings using a plain JSON file.
///
///
/// The following example shows how to save and load settings.
///
/// using Swan.Configuration;
///
/// public class Example
/// {
/// public static void Main()
/// {
/// // get user from settings
/// var user = SettingsProvider<Settings>.Instance.Global.User;
///
/// // modify the port
/// SettingsProvider<Settings>.Instance.Global.Port = 20;
///
/// // if we want these settings to persist
/// SettingsProvider<Settings>.Instance.PersistGlobalSettings();
/// }
///
/// public class Settings
/// {
/// public int Port { get; set; } = 9696;
///
/// public string User { get; set; } = "User";
/// }
/// }
///
///
/// The type of settings model.
public sealed class SettingsProvider
: SingletonBase>
{
private readonly object _syncRoot = new object();
private T _global;
///
/// Gets or sets the configuration file path. By default the entry assembly directory is used
/// and the filename is 'appsettings.json'.
///
///
/// The configuration file path.
///
public string ConfigurationFilePath { get; set; } =
Path.Combine(SwanRuntime.EntryAssemblyDirectory, "appsettings.json");
///
/// Gets the global settings object.
///
///
/// The global settings object.
///
public T Global
{
get
{
lock (_syncRoot)
{
if (Equals(_global, default(T)))
ReloadGlobalSettings();
return _global;
}
}
}
///
/// Reloads the global settings.
///
public void ReloadGlobalSettings()
{
if (File.Exists(ConfigurationFilePath) == false || File.ReadAllText(ConfigurationFilePath).Length == 0)
{
ResetGlobalSettings();
return;
}
lock (_syncRoot)
_global = Json.Deserialize(File.ReadAllText(ConfigurationFilePath));
}
///
/// Persists the global settings.
///
public void PersistGlobalSettings() => File.WriteAllText(ConfigurationFilePath, Json.Serialize(Global, true));
///
/// Resets the global settings.
///
public void ResetGlobalSettings()
{
lock (_syncRoot)
_global = Activator.CreateInstance();
PersistGlobalSettings();
}
}
}