public bool Parse( XElement node, out IEnumerable <T> enumer, ErrorMaskBuilder?errorMask, TranslationCrystal?translationMask, XmlSubParseDelegate <T> transl) { var ret = new List <T>(); int i = 0; var subCrystal = translationMask?.GetSubCrystal(0); foreach (var listElem in node.Elements()) { using (errorMask?.PushIndex(i++)) { try { if (transl(listElem, out var subItem, errorMask, subCrystal)) { ret.Add(subItem); } } catch (Exception ex) when(errorMask != null) { errorMask.ReportException(ex); } } } enumer = ret; return(true); }
private bool ParseKey( XElement root, XmlSubParseDelegate <K> keyTransl, [MaybeNullWhen(false)] out K item, ErrorMaskBuilder?errorMask, TranslationCrystal?translationMask) { var keyElem = root.Element(XName.Get("Key")); if (keyElem == null) { errorMask.ReportExceptionOrThrow( new ArgumentException("Key field did not exist")); item = default; return(false); } var keyCount = keyElem.Elements().Count(); if (keyCount != 1) { errorMask.ReportExceptionOrThrow( new ArgumentException($"Key field has unexpected count: {keyCount}")); item = default; return(false); } return(keyTransl( keyElem.Elements().First(), out item, errorMask: errorMask, translationMask: translationMask)); }
public virtual bool ParseSingleItem( XElement root, XmlSubParseDelegate <K> keyTransl, XmlSubParseDelegate <V> valTransl, [MaybeNullWhen(false)] out KeyValuePair <K, V> item, ErrorMaskBuilder?errorMask, TranslationCrystal?translationMask) { bool gotKey = false; K? key = default; using (errorMask?.PushIndex(KEY_ERR_INDEX)) { try { gotKey = ParseKey( root: root, keyTransl: keyTransl, item: out key, errorMask: errorMask, translationMask: translationMask); } catch (Exception ex) when(errorMask != null) { errorMask.ReportException(ex); } } using (errorMask?.PushIndex(VAL_ERR_INDEX)) { try { if (ParseValue( root: root, valTransl: valTransl, item: out var val, errorMask: errorMask, translationMask: translationMask) && gotKey) { item = new KeyValuePair <K, V>( key !, val); return(true); } } catch (Exception ex) when(errorMask != null) { errorMask.ReportException(ex); } } item = default; return(false); }
public bool ParseInto( XElement node, IDictionary <K, V> item, int fieldIndex, ErrorMaskBuilder?errorMask, TranslationCrystal?translationMask, XmlSubParseDelegate <K> keyTransl, XmlSubParseDelegate <V> valTransl) { throw new NotImplementedException(); }
public bool Parse( XmlSubParseDelegate <K> keyTransl, XmlSubParseDelegate <V> valTransl, XElement root, out IEnumerable <KeyValuePair <K, V> > item, ErrorMaskBuilder?errorMask, TranslationCrystal?translationMask) { var ret = new List <KeyValuePair <K, V> >(); int i = 0; foreach (var listElem in root.Elements()) { using (errorMask?.PushIndex(i++)) { try { if (ParseSingleItem( listElem, keyTransl, valTransl, out var subItem, errorMask: errorMask, translationMask: translationMask)) { ret.Add(subItem); } } catch (Exception ex) when(errorMask != null) { errorMask.ReportException(ex); } } } item = ret; return(true); }