Example #1
0
        public static MemberValue[] CreateFromTuple(TupleType tupleType, object value)
        {
            var structValue = new List <MemberValue>();

            var input = value as object[];

            if (input == null)
            {
                input = _parametersEncoder.GetTupleComponentValuesFromTypeAttributes(value.GetType(), value);
            }

            if (input == null)
            {
                return(structValue.ToArray());
            }

            for (int i = 0; i < input.Length; i++)
            {
                var structInnerValue = new MemberValue();
                var component        = tupleType.Components[i];
                if (component.ABIType is TupleType tupleTypeComponent)
                {
                    structInnerValue.TypeName = component.StructTypeName;
                    structInnerValue.Value    = CreateFromTuple(component, input[i]);
                    structValue.Add(structInnerValue);
                }
                else if (component.ABIType is ArrayType arrayType)
                {
                    if (arrayType.ElementType is TupleType tupleTypeElement)
                    {
                        var innerInput = input[i] as object[];

                        if (innerInput == null)
                        {
                            innerInput = _parametersEncoder.GetTupleComponentValuesFromTypeAttributes(input[i].GetType(), input[i]);
                        }

                        if (innerInput == null)
                        {
                            structInnerValue.TypeName = component.StructTypeName;
                            structInnerValue.Value    = new List <MemberValue>();
                        }
                        else
                        {
                            var arrayMemberValue = new List <MemberValue[]>();
                            foreach (var itemValue in innerInput)
                            {
                                arrayMemberValue.Add(CreateFromTuple(tupleTypeElement, itemValue));
                            }

                            structInnerValue.TypeName = component.StructTypeName;
                            structInnerValue.Value    = arrayMemberValue;
                        }
                    }
                    else
                    {
                        structInnerValue.TypeName = component.Type;
                        structInnerValue.Value    = input[i];
                        structValue.Add(structInnerValue);
                    }
                }
                else
                {
                    structInnerValue.TypeName = component.Type;
                    structInnerValue.Value    = input[i];
                    structValue.Add(structInnerValue);
                }
            }
            return(structValue.ToArray());
        }