using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
#nullable enable
namespace Terminal.Gui {
public static partial class ConfigurationManager {
///
/// The root object of Terminal.Gui configuration settings / JSON schema. Contains only properties
/// attributed with .
///
///
/// {
/// "$schema" : "https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json",
/// "Application.UseSystemConsole" : true,
/// "Theme" : "Default",
/// "Themes": {
/// },
/// },
///
///
///
[JsonConverter (typeof (ScopeJsonConverter))]
public class SettingsScope : Scope {
///
/// Points to our JSON schema.
///
[JsonInclude, JsonPropertyName ("$schema")]
public string Schema { get; set; } = "https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json";
///
/// The list of paths to the configuration files.
///
public List Sources = new List ();
///
/// Updates the with the settings in a JSON string.
///
/// Json document to update the settings with.
/// The source (filename/resource name) the Json document was read from.
public SettingsScope? Update (Stream stream, string source)
{
// Update the existing settings with the new settings.
try {
Update (JsonSerializer.Deserialize (stream, serializerOptions)!);
OnUpdated ();
Debug.WriteLine ($"ConfigurationManager: Read configuration from \"{source}\"");
Sources.Add (source);
return this;
} catch (JsonException e) {
if (ThrowOnJsonErrors ?? false) {
throw;
} else {
AddJsonError ($"Error deserializing {source}: {e.Message}");
}
}
return this;
}
///
/// Updates the with the settings in a JSON file.
///
///
public SettingsScope? Update (string filePath)
{
var realPath = filePath.Replace("~", Environment.GetFolderPath (Environment.SpecialFolder.UserProfile));
if (!File.Exists (realPath)) {
Debug.WriteLine ($"ConfigurationManager: Configuration file \"{realPath}\" does not exist.");
Sources.Add (filePath);
return this;
}
var stream = File.OpenRead (realPath);
return Update (stream, filePath);
}
///
/// Updates the with the settings from a Json resource.
///
///
///
public SettingsScope? UpdateFromResource (Assembly assembly, string resourceName)
{
if (resourceName == null || string.IsNullOrEmpty (resourceName)) {
Debug.WriteLine ($"ConfigurationManager: Resource \"{resourceName}\" does not exist in \"{assembly.GetName ().Name}\".");
return this;
}
using Stream? stream = assembly.GetManifestResourceStream (resourceName)!;
if (stream == null) {
Debug.WriteLine ($"ConfigurationManager: Failed to read resource \"{resourceName}\" from \"{assembly.GetName ().Name}\".");
return this;
}
return Update (stream, $"resource://[{assembly.GetName().Name}]/{resourceName}");
}
///
/// Updates the with the settings in a JSON string.
///
/// Json document to update the settings with.
/// The source (filename/resource name) the Json document was read from.
public SettingsScope? Update (string json, string source)
{
var stream = new MemoryStream ();
var writer = new StreamWriter (stream);
writer.Write (json);
writer.Flush ();
stream.Position = 0;
return Update (stream, source);
}
}
}
}