diff options
Diffstat (limited to 'Ryujinx.Debugger/Profiler/ProfilerConfiguration.cs')
-rw-r--r-- | Ryujinx.Debugger/Profiler/ProfilerConfiguration.cs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/Ryujinx.Debugger/Profiler/ProfilerConfiguration.cs b/Ryujinx.Debugger/Profiler/ProfilerConfiguration.cs new file mode 100644 index 00000000..e0842f2e --- /dev/null +++ b/Ryujinx.Debugger/Profiler/ProfilerConfiguration.cs @@ -0,0 +1,68 @@ +using Gdk; +using System; +using System.IO; +using Utf8Json; +using Utf8Json.Resolvers; + +namespace Ryujinx.Debugger.Profiler +{ + public class ProfilerConfiguration + { + public bool Enabled { get; private set; } + public string DumpPath { get; private set; } + public float UpdateRate { get; private set; } + public int MaxLevel { get; private set; } + public int MaxFlags { get; private set; } + public float History { get; private set; } + + /// <summary> + /// Loads a configuration file from disk + /// </summary> + /// <param name="path">The path to the JSON configuration file</param> + public static ProfilerConfiguration Load(string path) + { + var resolver = CompositeResolver.Create( + new[] { new ConfigurationEnumFormatter<Key>() }, + new[] { StandardResolver.AllowPrivateSnakeCase } + ); + + if (!File.Exists(path)) + { + throw new FileNotFoundException($"Profiler configuration file {path} not found"); + } + + using (Stream stream = File.OpenRead(path)) + { + return JsonSerializer.Deserialize<ProfilerConfiguration>(stream, resolver); + } + } + + private class ConfigurationEnumFormatter<T> : IJsonFormatter<T> + where T : struct + { + public void Serialize(ref JsonWriter writer, T value, IJsonFormatterResolver formatterResolver) + { + formatterResolver.GetFormatterWithVerify<string>() + .Serialize(ref writer, value.ToString(), formatterResolver); + } + + public T Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver) + { + if (reader.ReadIsNull()) + { + return default(T); + } + + string enumName = formatterResolver.GetFormatterWithVerify<string>() + .Deserialize(ref reader, formatterResolver); + + if (Enum.TryParse<T>(enumName, out T result)) + { + return result; + } + + return default(T); + } + } + } +} |