예제 #1
0
    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);
    }
예제 #2
0
    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));
    }
예제 #3
0
    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);
    }
예제 #4
0
 public bool ParseInto(
     XElement node,
     IDictionary <K, V> item,
     int fieldIndex,
     ErrorMaskBuilder?errorMask,
     TranslationCrystal?translationMask,
     XmlSubParseDelegate <K> keyTransl,
     XmlSubParseDelegate <V> valTransl)
 {
     throw new NotImplementedException();
 }
예제 #5
0
    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);
    }