示例#1
0
            static RpcParameterInfo ExtractParam(ParameterInfo parameterInfo)
            {
                Type             parameterType = parameterInfo.ParameterType;
                RpcParameterType type          = RpcParameterUtil.GetRpcType(parameterType);

                return(new RpcParameterInfo(parameterInfo.Name, type, parameterInfo.ParameterType, parameterInfo.IsOptional));
            }
示例#2
0
        static JsonBytesRpcParameter FromRaw(object?value, JsonSerializerOptions?serializerOptions = null)
        {
            string           json = JsonSerializer.Serialize(value, serializerOptions);
            RpcParameterType type = value != null?RpcParameterUtil.GetRpcType(value.GetType()) : RpcParameterType.Null;

            JsonElement element = JsonDocument.Parse(json).RootElement;

            return(new JsonBytesRpcParameter(type, element, serializerOptions));
        }
        private bool ParametersMatch(RpcRequestSignature requestSignature, IReadOnlyList <IRpcParameterInfo> parameters)
        {
            if (!requestSignature.HasParameters)
            {
                return(parameters == null || !parameters.Any(p => !p.IsOptional));
            }
            int parameterCount = 0;

            if (requestSignature.IsDictionary)
            {
                foreach ((Memory <char> name, RpcParameterType type) in requestSignature.ParametersAsDict)
                {
                    bool found = false;
                    for (int paramIndex = 0; paramIndex < parameters.Count; paramIndex++)
                    {
                        IRpcParameterInfo parameter = parameters[paramIndex];
                        if (!RpcUtil.NamesMatch(parameter.Name.AsSpan(), name.Span) ||
                            !RpcParameterUtil.TypesCompatible(parameter.Type, type))
                        {
                            continue;
                        }
                        found = true;
                        break;
                    }
                    if (!found)
                    {
                        return(false);
                    }
                    parameterCount++;
                }
            }
            else
            {
                foreach (RpcParameterType parameterType in requestSignature.ParametersAsList)
                {
                    if (parameters.Count <= parameterCount)
                    {
                        return(false);
                    }
                    IRpcParameterInfo info = parameters[parameterCount];
                    if (!RpcParameterUtil.TypesCompatible(info.Type, parameterType))
                    {
                        return(false);
                    }

                    parameterCount++;
                }


                for (int i = parameterCount; i < parameters.Count; i++)
                {
                    //Only if the last parameters in the method are optional does the request match
                    //Will be skipped if they are equal length
                    if (!parameters[i].IsOptional)
                    {
                        return(false);
                    }
                }
            }
            if (parameterCount != parameters.Count)
            {
                return(false);
            }
            return(true);
        }