public override ControllerLayout Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var jsonDoc = JsonDocument.ParseValue(ref reader); var rootElem = jsonDoc.RootElement; string layoutName = rootElem.GetProperty("LayoutID").GetString() !; string friendlyName = rootElem.GetProperty("FriendlyName").GetString() !; IEnumerable <PlatformId> platforms = rootElem.GetProperty("Platforms") .EnumerateArray().Select(s => (PlatformId)s.GetString() !) .ToImmutableArray(); IEnumerable <(ControllerElement element, ControllerElementInfo info)> elements = from layoutElem in rootElem.GetProperty("Layout").EnumerateObject() let elementKey = ControllerElementExtensions.Parse(layoutElem.Name) let elementInfoElem = layoutElem.Value let elementLabel = elementInfoElem.GetProperty("Label").GetString() let elementType = ControllerElementTypeExtensions.Parse(elementInfoElem.GetProperty("Type").GetString() !) select(elementKey, elementInfo: new ControllerElementInfo(elementLabel, elementType)); var layout = new ControllerElementCollection(); foreach (var(elementKey, elementInfo) in elements) { layout.Add(elementKey, elementInfo); } return(new ControllerLayout(layoutName, platforms, friendlyName, layout)); }
/// <inheritdoc/> protected override IControllerLayout Create(Type objectType, JObject jObject) { string layoutName = jObject.Value <string>("LayoutID"); string friendlyName = jObject.Value <string>("FriendlyName"); IEnumerable <string> platformsWhitelist = jObject.Value <JArray>("Platforms").Values <string>(); var jlayout = jObject.Value <JObject>("Layout"); bool isDevice = jObject.Value <bool>("IsRealDevice"); // var layout = new ControllerLayout(layoutName, platformsWhitelist, friendlyName, isDevice); var layout = new ControllerElementCollection(); foreach (var controllerElement in from layoutElements in jlayout.Properties() let elementKey = Enums.Parse <ControllerElement>(layoutElements.Name) let elementLabel = layoutElements.Value.Value <string>("Label") let elementType = Enums.Parse <ControllerElementType>(layoutElements.Value.Value <string>("Type")) select(elementKey: elementKey, elementInfo: new ControllerElementInfo(elementLabel, elementType))) { layout.Add(controllerElement.elementKey, controllerElement.elementInfo); } return(new ControllerLayout(layoutName, platformsWhitelist.Cast <PlatformId>(), friendlyName, layout, isDevice)); }