示例#1
0
        public async Task <ReadResource.Types.Response> ReadResource(ReadResource.Types.Request request)
        {
            var current = DeserializeDynamicValue(request.CurrentState);

            var read = await _resourceProvider.ReadAsync(current);

            var readSerialized = SerializeDynamicValue(read);

            return(new ReadResource.Types.Response
            {
                NewState = readSerialized,
            });
        }
        public override async Task <ReadResource.Types.Response> ReadResource(
            ReadResource.Types.Request request, ServerCallContext context)
        {
            var response = new ReadResource.Types.Response();

            var providerType = _schemaResolver.PluginDetails.Provider;
            var resType      = _schemaResolver.GetResourceSchemas()[request.TypeName].Type;

            if (providerType.HasReadResourceSkill(resType))
            {
                providerType.InvokeReadResourceSkill(
                    PluginProviderInstance,
                    resType,
                    writeInput: (inputType, input) => {
                    inputType.GetProperty(nameof(request.CurrentState)).SetValue(input,
                                                                                 request.CurrentState.UnmarshalFromDynamicValue(resType));
                    inputType.GetProperty(nameof(request.Private)).SetValue(input,
                                                                            request.Private?.ToByteArray());
                },
                    readResult: (resultType, result) => {
                    var diagnostics = ((TFDiagnostics)resultType.GetProperty(nameof(response.Diagnostics))
                                       .GetValue(result));
                    if (diagnostics.Count() > 0)
                    {
                        response.Diagnostics.Add(diagnostics.All());
                    }

                    var newState = resultType
                                   .GetProperty(nameof(response.NewState))
                                   .GetValue(result);
                    if (newState != null)
                    {
                        response.NewState = newState.MarshalToDynamicValue(resType);
                    }

                    var prv = resultType
                              .GetProperty(nameof(response.Private))
                              .GetValue(result);
                    if (prv != null)
                    {
                        response.Private = ByteString.CopyFrom((byte[])prv);
                    }
                });
            }
            else
            {
                _log.LogWarning("provider does not handle reading for resource [{type}]", resType);
            }

            return(await Task.FromResult(response));
        }
示例#3
0
    public override Task <ReadResource.Types.Response> ReadResource(ReadResource.Types.Request request, ServerCallContext context)
    {
        if (!_resourceRegistry.Types.TryGetValue(request.TypeName, out var resourceType))
        {
            return(Task.FromResult(new ReadResource.Types.Response
            {
                Diagnostics =
                {
                    new Diagnostic {
                        Detail = "Unkonwn type name."
                    },
                },
            }));
        }

        var providerHostType = typeof(ResourceProviderHost <>).MakeGenericType(resourceType);
        var provider         = _serviceProvider.GetService(providerHostType);

        return((Task <ReadResource.Types.Response>)providerHostType.GetMethod(nameof(ResourceProviderHost <object> .ReadResource))
               .Invoke(provider, new[] { request }));
    }