using OpenTK.Input; using System; using System.IO; using Utf8Json; using Utf8Json.Resolvers; namespace Ryujinx.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; } public ProfilerKeyboardHandler Controls { get; private set; } /// /// Loads a configuration file from disk /// /// The path to the JSON configuration file public static ProfilerConfiguration Load(string path) { var resolver = CompositeResolver.Create( new[] { new ConfigurationEnumFormatter() }, 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(stream, resolver); } } private class ConfigurationEnumFormatter : IJsonFormatter where T : struct { public void Serialize(ref JsonWriter writer, T value, IJsonFormatterResolver formatterResolver) { formatterResolver.GetFormatterWithVerify() .Serialize(ref writer, value.ToString(), formatterResolver); } public T Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver) { if (reader.ReadIsNull()) { return default(T); } string enumName = formatterResolver.GetFormatterWithVerify() .Deserialize(ref reader, formatterResolver); if (Enum.TryParse(enumName, out T result)) { return result; } return default(T); } } } }