// Copyright Keysight Technologies 2012-2019 // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, you can obtain one at http://mozilla.org/MPL/2.0/. using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Xml.Linq; namespace OpenTap.Plugins { /// Serializer implementation for default value attributes. public class DefaultValueSerializer : TapSerializerPlugin { /// The order of this serializer. public override double Order => 10; HashSet elems = new HashSet(); readonly Dictionary defaultValueLookup = new Dictionary(); /// /// Registers a default value for an XML element. /// /// /// public void RegisterDefaultValue(XElement elem, object value) { defaultValueLookup[elem] = value; } /// Deserialization implementation. public override bool Deserialize(XElement element, ITypeData t, Action setter) { return false; } /// Serialization implementation. public override bool Serialize(XElement elem, object obj, ITypeData expectedType) { if (elems.Contains(elem)) return false; try { elems.Add(elem); bool ok = Serializer.Serialize(elem, obj, expectedType, true); if (defaultValueLookup.TryGetValue(elem, out var defaultValue)) { if (defaultValue is object[] objs && obj is IEnumerable e) { if (e.Cast().SequenceEqual(objs) && elem.HasAttributes == false) { elem.Remove(); } } if (object.Equals(defaultValue, obj) && elem.HasAttributes == false) { // To remove this case since default value is same as specified value // 0.1. // These cases are NOT to be removed // 0.1. // 0.1. elem.Remove(); } } return ok; } finally { elems.Remove(elem); } } } }