@using System @using System.Linq @using AutoRest.Core.Utilities @using AutoRest.CSharp @using AutoRest.CSharp.Model @inherits AutoRest.Core.Template namespace @Settings.Namespace { internal static class @(XmlSerialization.XmlDeserializationClass) { internal delegate bool XmlRootDeserializer( System.Xml.Linq.XElement root, out T result ); internal delegate bool XmlDeserializer( System.Xml.Linq.XElement parent, string propertyName, out T result ); internal static XmlRootDeserializer Root( XmlDeserializer deserializer ) => (System.Xml.Linq.XElement root, out T result) => deserializer(new System.Xml.Linq.XElement("artificialRoot", root), root.Name.LocalName, out result); private static XmlDeserializer Unroot( XmlRootDeserializer deserializer ) { return (System.Xml.Linq.XElement parent, string propertyName, out T result) => { result = default(T); var element = parent.Element(propertyName); if (element == null) { return false; } return deserializer(element, out result); }; } private static XmlRootDeserializer ToRootDeserializer( System.Func unsafeDeserializer ) => (System.Xml.Linq.XElement root, out T result) => { try { result = unsafeDeserializer(root); return true; } catch { result = default(T); return false; }}; internal static XmlDeserializer ToDeserializer( System.Func unsafeDeserializer ) => Unroot(ToRootDeserializer(unsafeDeserializer)); internal static XmlDeserializer> CreateListXmlDeserializer( XmlDeserializer elementDeserializer, string elementTagName = null /*if isWrapped = false*/ ) { if (elementTagName != null) { // create non-wrapped deserializer and forward var slave = CreateListXmlDeserializer( elementDeserializer ); return (System.Xml.Linq.XElement parent, string propertyName, out System.Collections.Generic.IList result) => { result = null; var wrapper = parent.Element(propertyName); return wrapper != null && slave(wrapper, elementTagName, out result); }; } var rootElementDeserializer = Root(elementDeserializer); return (System.Xml.Linq.XElement parent, string propertyName, out System.Collections.Generic.IList result) => { result = new System.Collections.Generic.List(); foreach (var element in parent.Elements(propertyName)) { T elementResult; if (!rootElementDeserializer(element, out elementResult)) { return false; } result.Add(elementResult); } return true; }; } internal static XmlDeserializer> CreateDictionaryXmlDeserializer( XmlDeserializer elementDeserializer ) { return (System.Xml.Linq.XElement parent, string propertyName, out System.Collections.Generic.IDictionary result) => { result = null; var childElement = parent.Element(propertyName); if (childElement == null) { return false; } result = new System.Collections.Generic.Dictionary(); foreach (var element in childElement.Elements()) { T elementResult; if (!elementDeserializer(childElement, element.Name.LocalName, out elementResult)) { return false; } result.Add(element.Name.LocalName, elementResult); } return true; }; } } }