in src/AutoRest.CSharp/Mgmt/Generation/ResourceWriter.cs [141:220]
private void WriteTaggableCommonMethodFromPutOrPatch(bool isAsync, string setCode, bool isSetTags = false)
{
if (This.UpdateOperation is null && This.CreateOperation is null)
throw new InvalidOperationException($"Unexpected null update method for resource {This.ResourceName} while its marked as taggable");
var updateOperation = (This.UpdateOperation ?? This.CreateOperation)!;
var getOperation = This.GetOperation;
var updateMethodName = updateOperation.Name;
var configureStr = isAsync ? ".ConfigureAwait(false)" : string.Empty;
var awaitStr = isAsync ? "await " : string.Empty;
_writer.Line($"var current = ({awaitStr}{CreateMethodName(getOperation.Name, isAsync)}(cancellationToken: cancellationToken){configureStr}).Value.Data;");
var lroParamStr = updateOperation.IsLongRunningOperation ? "WaitUntil.Completed, " : string.Empty;
var parameters = updateOperation.IsLongRunningOperation ? updateOperation.MethodSignature.Parameters.Skip(1) : updateOperation.MethodSignature.Parameters;
var bodyParamType = parameters.First().Type;
string bodyParamName = "current";
//if we are using PATCH always minimize what we pass in the body to what we actually want to change
if (bodyParamType.Name != This.ResourceData.Type.Name || updateOperation.OperationMappings.Values.First().Operation.HttpMethod == RequestMethod.Patch)
{
bodyParamName = "patch";
if (bodyParamType is { IsFrameworkType: false, Implementation: ObjectType objectType })
{
Configuration.MgmtConfiguration.PatchInitializerCustomization.TryGetValue(bodyParamType.Name, out var customizations);
customizations ??= new Dictionary<string, string>();
_writer.Append($"var patch = new {bodyParamType}(");
foreach (var parameter in objectType.InitializationConstructor.Signature.Parameters)
{
var varName = parameter.Name.FirstCharToUpperCase();
if (customizations.TryGetValue(varName, out var customization))
{
_writer.Append($"{customization}");
}
else
{
_writer.Append($"current.{varName}, ");
}
}
_writer.RemoveTrailingComma();
_writer.Line($");");
}
else
{
_writer.Line($"var patch = new {bodyParamType}();");
}
if (!isSetTags)
{
using (_writer.Scope($"foreach(var tag in current.Tags)"))
{
_writer.Line($"patch.Tags.Add(tag);");
}
}
Configuration.MgmtConfiguration.UpdateRequiredCopy.TryGetValue(This.ResourceName, out var properties);
if (properties is not null)
{
foreach (var property in properties.Split(','))
{
_writer.Line($"patch.{property} = current.{property};");
}
}
}
_writer.Line($"{bodyParamName}.Tags{setCode};");
_writer.Line($"var result = {awaitStr}{CreateMethodName(updateMethodName, isAsync)}({lroParamStr}{bodyParamName}, cancellationToken: cancellationToken){configureStr};");
if (updateOperation.IsLongRunningOperation)
{
if (updateOperation.MgmtReturnType == null)
{
_writer.Line($"return {awaitStr}{CreateMethodName(getOperation.Name, isAsync)}(cancellationToken: cancellationToken){configureStr};");
}
else
{
_writer.Line($"return {Configuration.ApiTypes.ResponseType}.FromValue(result.Value, result.{Configuration.ApiTypes.GetRawResponseName}());");
}
}
else
{
_writer.Line($"return result;");
}
}