summaryrefslogtreecommitdiff
path: root/StardewModdingAPI/Config.cs
diff options
context:
space:
mode:
authorGormogon <Gormogon@users.noreply.github.com>2016-05-29 18:23:01 -0400
committerGormogon <Gormogon@users.noreply.github.com>2016-05-29 18:23:01 -0400
commit27dece2cf445147c5e2848f9ec26f38a101f50fc (patch)
tree2579d0979dd9f295972e5ba2a81f4177589f7395 /StardewModdingAPI/Config.cs
parent85142935b63324f7c6131a8855acea0a2d534879 (diff)
downloadSMAPI-27dece2cf445147c5e2848f9ec26f38a101f50fc.tar.gz
SMAPI-27dece2cf445147c5e2848f9ec26f38a101f50fc.tar.bz2
SMAPI-27dece2cf445147c5e2848f9ec26f38a101f50fc.zip
Attempt to migrate to new directory structure.
Diffstat (limited to 'StardewModdingAPI/Config.cs')
-rw-r--r--StardewModdingAPI/Config.cs176
1 files changed, 0 insertions, 176 deletions
diff --git a/StardewModdingAPI/Config.cs b/StardewModdingAPI/Config.cs
deleted file mode 100644
index c5b7beca..00000000
--- a/StardewModdingAPI/Config.cs
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- Copyright 2016 Zoey (Zoryn)
-*/
-
-using System;
-using System.IO;
-using System.Linq;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-
-namespace StardewModdingAPI
-{
- public class Config
- {
- [JsonIgnore]
- public virtual string ConfigLocation { get; protected internal set; }
-
- [JsonIgnore]
- public virtual string ConfigDir => Path.GetDirectoryName(ConfigLocation);
-
- public virtual Config Instance<T>() where T : Config => Activator.CreateInstance<T>();
-
- /// <summary>
- /// Loads the config from the json blob on disk, updating and re-writing to the disk if needed.
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <returns></returns>
- public virtual T LoadConfig<T>() where T : Config
- {
- if (string.IsNullOrEmpty(ConfigLocation))
- {
- Log.AsyncR("A config tried to load without specifying a location on the disk.");
- return null;
- }
-
- T ret = null;
-
- if (!File.Exists(ConfigLocation))
- {
- //no config exists, generate default values
- var c = GenerateDefaultConfig<T>();
- c.ConfigLocation = ConfigLocation;
- ret = c;
- }
- else
- {
- try
- {
- //try to load the config from a json blob on disk
- var c = JsonConvert.DeserializeObject<T>(File.ReadAllText(ConfigLocation), new JsonSerializerSettings {ContractResolver = new JsonResolver()});
-
- c.ConfigLocation = ConfigLocation;
-
- //update the config with default values if needed
- ret = c.UpdateConfig<T>();
-
- c = null;
- }
- catch (Exception ex)
- {
- Log.AsyncR($"Invalid JSON ({GetType().Name}): {ConfigLocation} \n{ex}");
- return GenerateDefaultConfig<T>();
- }
- }
-
- ret.WriteConfig();
- return ret;
- }
-
- /// <summary>
- /// MUST be implemented in inheriting class!
- /// </summary>
- public virtual T GenerateDefaultConfig<T>() where T : Config
- {
- return null;
- }
-
- /// <summary>
- /// Merges a default-value config with the user-config on disk.
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <returns></returns>
- public virtual T UpdateConfig<T>() where T : Config
- {
- try
- {
- //default config
- var b = JObject.FromObject(Instance<T>().GenerateDefaultConfig<T>(), new JsonSerializer {ContractResolver = new JsonResolver()});
-
- //user config
- var u = JObject.FromObject(this, new JsonSerializer {ContractResolver = new JsonResolver()});
-
- //overwrite default values with user values
- b.Merge(u, new JsonMergeSettings {MergeArrayHandling = MergeArrayHandling.Replace});
-
- //cast json object to config
- var c = b.ToObject<T>();
-
- //re-write the location on disk to the object
- c.ConfigLocation = ConfigLocation;
-
- return c;
- }
- catch (Exception ex)
- {
- Log.AsyncR("An error occured when updating a config: " + ex);
- return this as T;
- }
- }
- }
-
- public static class ConfigExtensions
- {
- /// <summary>
- /// Initializes an instance of any class that inherits from Config.
- /// This method performs the loading, saving, and merging of the config on the disk and in memory at a default state.
- /// This method should not be used to re-load or to re-save a config.
- /// NOTE: You MUST set your config EQUAL to the return of this method!
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="baseConfig"></param>
- /// <param name="configLocation"></param>
- /// <returns></returns>
- public static T InitializeConfig<T>(this T baseConfig, string configLocation) where T : Config
- {
- if (baseConfig == null)
- {
- baseConfig = Activator.CreateInstance<T>();
- /*
- Log.AsyncR("A config tried to initialize whilst being null.");
- return null;
- */
- }
-
- if (string.IsNullOrEmpty(configLocation))
- {
- Log.AsyncR("A config tried to initialize without specifying a location on the disk.");
- return null;
- }
-
- baseConfig.ConfigLocation = configLocation;
- var c = baseConfig.LoadConfig<T>();
-
- return c;
- }
-
- /// <summary>
- /// Writes a config to a json blob on the disk specified in the config's properties.
- /// </summary>
- public static void WriteConfig<T>(this T baseConfig) where T : Config
- {
- if (string.IsNullOrEmpty(baseConfig?.ConfigLocation) || string.IsNullOrEmpty(baseConfig.ConfigDir))
- {
- Log.AsyncR("A config attempted to save when it itself or it's location were null.");
- return;
- }
-
- var s = JsonConvert.SerializeObject(baseConfig, typeof(T), Formatting.Indented, new JsonSerializerSettings {ContractResolver = new JsonResolver()});
-
- if (!Directory.Exists(baseConfig.ConfigDir))
- Directory.CreateDirectory(baseConfig.ConfigDir);
-
- if (!File.Exists(baseConfig.ConfigLocation) || !File.ReadAllText(baseConfig.ConfigLocation).SequenceEqual(s))
- File.WriteAllText(baseConfig.ConfigLocation, s);
- }
-
- /// <summary>
- /// Re-reads the json blob on the disk and merges its values with a default config.
- /// NOTE: You MUST set your config EQUAL to the return of this method!
- /// </summary>
- public static T ReloadConfig<T>(this T baseConfig) where T : Config
- {
- return baseConfig.LoadConfig<T>();
- }
- }
-} \ No newline at end of file