using System; using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Data.Extensions; namespace SabreTools.Metadata.DatItems.Formats { /// /// Represents a single port on a machine /// [JsonObject("port"), XmlRoot("port")] public sealed class Port : DatItem { #region Fields /// /> protected override ItemType ItemType => ItemType.Port; [JsonIgnore] public bool AnalogsSpecified { get { var analogs = Read(Data.Models.Metadata.Port.AnalogKey); return analogs is not null && analogs.Length > 0; } } #endregion #region Constructors public Port() : base() { } public Port(Data.Models.Metadata.Port item) : base(item) { // Handle subitems var analogs = item.ReadArray(Data.Models.Metadata.Port.AnalogKey); if (analogs is not null) { Analog[] analogItems = Array.ConvertAll(analogs, analog => new Analog(analog)); Write(Data.Models.Metadata.Port.AnalogKey, analogItems); } } public Port(Data.Models.Metadata.Port item, Machine machine, Source source) : this(item) { Write(SourceKey, source); CopyMachineInformation(machine); } #endregion #region Cloning Methods /// public override object Clone() => new Port(_internal.Clone() as Data.Models.Metadata.Port ?? []); /// public override Data.Models.Metadata.Port GetInternalClone() { var portItem = base.GetInternalClone(); var analogs = Read(Data.Models.Metadata.Port.AnalogKey); if (analogs is not null) { Data.Models.Metadata.Analog[] analogItems = Array.ConvertAll(analogs, analog => analog.GetInternalClone()); portItem[Data.Models.Metadata.Port.AnalogKey] = analogItems; } return portItem; } #endregion } }