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); } } } }