using System; using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Data.Extensions; namespace SabreTools.Metadata.DatItems.Formats { /// /// Represents a single device on the machine /// [JsonObject("device"), XmlRoot("device")] public sealed class Device : DatItem { #region Fields /// /> protected override ItemType ItemType => ItemType.Device; [JsonIgnore] public bool InstancesSpecified { get { var instances = Read(Data.Models.Metadata.Device.InstanceKey); return instances is not null && instances.Length > 0; } } [JsonIgnore] public bool ExtensionsSpecified { get { var extensions = Read(Data.Models.Metadata.Device.ExtensionKey); return extensions is not null && extensions.Length > 0; } } #endregion #region Constructors public Device() : base() { } public Device(Data.Models.Metadata.Device item) : base(item) { // Process flag values bool? mandatory = ReadBool(Data.Models.Metadata.Device.MandatoryKey); if (mandatory is not null) Write(Data.Models.Metadata.Device.MandatoryKey, mandatory.FromYesNo()); string? deviceType = ReadString(Data.Models.Metadata.Device.DeviceTypeKey); if (deviceType is not null) Write(Data.Models.Metadata.Device.DeviceTypeKey, deviceType.AsDeviceType()?.AsStringValue()); // Handle subitems var instance = item.Read(Data.Models.Metadata.Device.InstanceKey); if (instance is not null) Write(Data.Models.Metadata.Device.InstanceKey, new Instance(instance)); var extensions = item.ReadArray(Data.Models.Metadata.Device.ExtensionKey); if (extensions is not null) { Extension[] extensionItems = Array.ConvertAll(extensions, extension => new Extension(extension)); Write(Data.Models.Metadata.Device.ExtensionKey, extensionItems); } } public Device(Data.Models.Metadata.Device item, Machine machine, Source source) : this(item) { Write(SourceKey, source); CopyMachineInformation(machine); } #endregion #region Cloning Methods /// public override object Clone() => new Device(_internal.Clone() as Data.Models.Metadata.Device ?? []); /// public override Data.Models.Metadata.Device GetInternalClone() { var deviceItem = base.GetInternalClone(); var instance = Read(Data.Models.Metadata.Device.InstanceKey); if (instance is not null) deviceItem[Data.Models.Metadata.Device.InstanceKey] = instance.GetInternalClone(); var extensions = Read(Data.Models.Metadata.Device.ExtensionKey); if (extensions is not null) { Data.Models.Metadata.Extension[] extensionItems = Array.ConvertAll(extensions, extension => extension.GetInternalClone()); deviceItem[Data.Models.Metadata.Device.ExtensionKey] = extensionItems; } return deviceItem; } #endregion } }