private void ReadResult(Type resType, Type resultType, object result, PlanResourceChange.Types.Response response)
        {
            var diagnostics = ((TFDiagnostics)resultType
                               .GetProperty(nameof(response.Diagnostics)).GetValue(result));
            var plannedPrivate = resultType
                                 .GetProperty(nameof(response.PlannedPrivate)).GetValue(result);
            var plannedState = resultType
                               .GetProperty(nameof(response.PlannedState)).GetValue(result);
            var requiresReplace = resultType
                                  .GetProperty(nameof(response.RequiresReplace)).GetValue(result);

            if (diagnostics.Count() > 0)
            {
                response.Diagnostics.Add(diagnostics.All());
            }
            if (plannedPrivate != null)
            {
                response.PlannedPrivate = ByteString.CopyFrom((byte[])plannedPrivate);
            }
            if (plannedState != null)
            {
                response.PlannedState = plannedState.MarshalToDynamicValue(resType, withUnknowns: true);
            }


            if (requiresReplace != null)
            {
                // Translates our internal representation of ValuePath to AttributePath
                var paths = (IEnumerable <TFSteps>)requiresReplace;
                response.RequiresReplace.Add(TFAttributePaths.ToPaths(paths));
            }
        }
        public override async Task <PlanResourceChange.Types.Response> PlanResourceChange(
            PlanResourceChange.Types.Request request, ServerCallContext context)
        {
            var response = new PlanResourceChange.Types.Response();

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

            if (providerType.HasPlanResourceChangeSkill(resType))
            {
                providerType.InvokePlanResourceChangeSkill(
                    PluginProviderInstance,
                    resType,
                    writeInput: (inputType, input) => WriteInput(resType, request, inputType, input),
                    readResult: (resultType, result) => ReadResult(resType, resultType, result, response)
                    );
            }
            else
            {
                _log.LogWarning("provider does not handle planning change for resource [{type}]", resType);
            }

            return(await Task.FromResult(response));
        }