public MessagePropertyValue CreatePropertyValue(object value, PropertyResolvingMode mode, int positionalValue = -1)
        {
            var level = _currentNestLevel;
            var ret   = ReturnDefaultIfMaxNestLevel(level) ?? _root.CreatePropertyValue(value, mode, level + 1, positionalValue);

            _currentNestLevel = level;
            return(ret);
        }
Ejemplo n.º 2
0
        public static bool TryResolveToEnumerable(object value, PropertyResolvingMode mode, NestParameterResolver nest, Type typeOfValue,
                                                  int maxLoopCountForCollection, out MessagePropertyValue result)
        {
            if (value is IEnumerable __enumerable)
            {
                if (TryGetDictionary(value, typeOfValue, out var dictionary))
                {
                    result = new DictionaryValue(DictionaryElements());
                    return(true);

                    IEnumerable <KeyValuePair <ScalarValue, MessagePropertyValue> > DictionaryElements()
                    {
                        var __index = 0;

                        foreach (DictionaryEntry __item in dictionary)
                        {
                            if (++__index > maxLoopCountForCollection)
                            {
                                yield break;
                            }
                            if (nest.CreatePropertyValue(__item.Key, mode) is ScalarValue __key)
                            {
                                var __value = nest.CreatePropertyValue(__item.Value, mode);
                                yield return(new KeyValuePair <ScalarValue, MessagePropertyValue>(__key, __value));
                            }
                        }
                    }
                }

                result = new SequenceValue(SequenceElements());
                return(true);

                IEnumerable <MessagePropertyValue> SequenceElements()
                {
                    var __index = 0;

                    foreach (var __item in __enumerable)
                    {
                        if (++__index > maxLoopCountForCollection)
                        {
                            yield break;
                        }
                        yield return(nest.CreatePropertyValue(__item, mode));
                    }
                }
            }

            result = null;
            return(false);
        }
Ejemplo n.º 3
0
        public static bool TryResolveCompilerGeneratedType(object value, PropertyResolvingMode mode, NestParameterResolver nest, Type typeOfValue,
                                                           bool raiseException, int positionalValue, out MessagePropertyValue result)
        {
            if (mode == PropertyResolvingMode.Destructure)
            {
                result = new StructureValue(StructureElements(), Tag());
                return(true);

                string Tag()
                {
                    var __tag = typeOfValue.Name;

                    if (string.IsNullOrWhiteSpace(__tag) || typeOfValue.IsCompilerGeneratedType())
                    {
                        __tag = null;
                    }
                    return(__tag);
                }

                IEnumerable <MessageProperty> StructureElements()
                {
                    foreach (var property in value.GetType().GetPropertiesRecursive())
                    {
                        dynamic propertyValue;
                        try {
                            propertyValue = property.GetValue(value);
                        }
                        catch (TargetParameterCountException) {
                            InternalLogger.WriteLine("The property accessor '{0}' is a non-default indexer", property);
                            continue;
                        }
                        catch (TargetInvocationException ex) {
                            InternalLogger.WriteLine("The property accessor '{0}' threw exception: {1}", property, ex);
                            if (raiseException)
                            {
                                throw;
                            }
                            propertyValue = $"Threw an exception at: {ex.InnerException?.GetType().Name}";
                        }

                        yield return(new MessageProperty(property.Name, positionalValue, nest.CreatePropertyValue(propertyValue, PropertyResolvingMode.Destructure)));
                    }
                }
            }

            result = null;
            return(false);
        }
Ejemplo n.º 4
0
        public static bool TryResolveToValueTuple(object value, PropertyResolvingMode mode, NestParameterResolver nest, Type typeOfValue,
                                                  out MessagePropertyValue result)
        {
            result = CheckingValueTypeDefinition(typeOfValue, value) ? new SequenceValue(SequenceElements()) : null;
            return(result != null);

            IEnumerable <MessagePropertyValue> SequenceElements()
            {
                var __fields = typeOfValue.GetTypeInfo().DeclaredFields.Where(f => f.IsPublic && !f.IsStatic);

                foreach (var __field in __fields)
                {
                    yield return(nest.CreatePropertyValue(__field.GetValue(value), mode));
                }
            }
        }
Ejemplo n.º 5
0
        internal MessagePropertyValue CreatePropertyValue(object value, PropertyResolvingMode mode, int level, int positionalValue)
        {
            if (value == null)
            {
                return(ReturnNullValue());
            }
            if (mode == PropertyResolvingMode.Stringify)
            {
                return(ReturnStringifyValue(value));
            }
            if (mode == PropertyResolvingMode.Destructure && value is string str)
            {
                value = FixStringifyValueForMaxLength(str);
            }

            var typeOfValue = value.GetType();

            _nestParameterResolver.SetNestLevel(level);

            if (_scalarResolveRules.TryResolve(value, out var result0))
            {
                return(result0);
            }
            if (_destructureResolveRules.TryResolve(value, mode, _nestParameterResolver, out var result1))
            {
                return(result1);
            }
            if (TypeFeeler.TryResolveToEnumerable(value, mode, _nestParameterResolver, typeOfValue, _maxLoopCountForCollection, out var result2))
            {
                return(result2);
            }
            if (TypeFeeler.TryResolveToValueTuple(value, mode, _nestParameterResolver, typeOfValue, out var result3))
            {
                return(result3);
            }
            if (TypeFeeler.TryResolveCompilerGeneratedType(value, mode, _nestParameterResolver, typeOfValue, _raiseExceptions, positionalValue, out var result4))
            {
                return(result4);
            }

            return(ReturnDefaultValue(value));
        }
Ejemplo n.º 6
0
        public static bool TryResolve(this IDestructureResolveRule[] rules, object value, PropertyResolvingMode mode,
                                      NestParameterResolver nest, out MessagePropertyValue result)
        {
            result = null;
            if (mode == PropertyResolvingMode.Destructure)
            {
                foreach (var rule in rules)
                {
                    if (rule.TryResolve(value, nest, out result))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Ejemplo n.º 7
0
 /// <inheritdoc />
 public MessagePropertyValue CreatePropertyValue(object value, PropertyResolvingMode mode, int positionalValue = -1)
 {
     return(CreatePropertyValue(value, mode, 1, positionalValue));
 }
Ejemplo n.º 8
0
 /// <inheritdoc />
 public MessageProperty CreateProperty(string name, object value, PropertyResolvingMode mode, int positionalValue = -1)
 {
     return(new MessageProperty(name, positionalValue, CreatePropertyValue(value, mode, positionalValue)));
 }