in src/AutoRest.CSharp/Mgmt/AutoRest/MgmtTarget.cs [63:252]
public static async Task ExecuteAsync(GeneratedCodeWorkspace project)
{
var addedFilenames = new HashSet<string>();
var serializeWriter = new SerializationWriter();
var isArmCore = Configuration.MgmtConfiguration.IsArmCore;
if (!isArmCore)
{
var utilCodeWriter = new CodeWriter();
var staticUtilWriter = new StaticUtilWriter(utilCodeWriter);
staticUtilWriter.Write();
AddGeneratedFile(project, $"ProviderConstants.cs", utilCodeWriter.ToString());
}
foreach (var helper in ExpressionTypeProvider.GetHelperProviders())
{
var helperWriter = new CodeWriter();
new ExpressionTypeProviderWriter(helperWriter, helper).Write();
project.AddGeneratedFile($"Internal/{helper.Type.Name}.cs", helperWriter.ToString());
}
foreach (var model in MgmtContext.Library.Models)
{
var name = model.Type.Name;
if (model is MgmtObjectType mot)
{
ModelItem mi = new ModelItem(mot.Declaration.Namespace, mot.Declaration.Name, mot.InputModel.Name, MgmtReport.Instance.TransformSection);
mi.Properties = mot.Properties.ToDictionary(p => p.Declaration.Name, p =>
{
if (p.InputModelProperty != null)
{
return new PropertyItem(p.Declaration.Name, p.Declaration.Type.GetNameForReport(), mot.GetFullSerializedName(p.InputModelProperty), MgmtReport.Instance.TransformSection);
}
else
{
AutoRestLogger.Warning($"Ignore Property '{mi.FullName}.{p.Declaration.Name}' without schema (i.e. AdditionalProperties)").Wait();
return new PropertyItem(p.Declaration.Name, p.Declaration.Type.GetNameForReport(), "<NoPropertySchemaFound>", MgmtReport.Instance.TransformSection);
}
});
MgmtReport.Instance.ModelSection.Add(mi.FullName, mi);
}
else if (model is EnumType et)
{
var inputType = MgmtContext.Library.SchemaMap.Value.First(map => map.Value == model).Key;
var choices = inputType switch
{
InputEnumType sc => sc.Values,
_ => throw new InvalidOperationException("Unexpected Schema type for EnumType: " + inputType.GetType())
};
EnumItem mi = new EnumItem(et.Declaration.Namespace, et.Declaration.Name, inputType.Name, MgmtReport.Instance.TransformSection);
mi.Values = et.Values.ToDictionary(v => v.Declaration.Name, v =>
{
var found = choices.FirstOrDefault(c => c.Value.ToString() == v.Value.Value?.ToString());
if (found == null)
{
var allValues = string.Join(",", choices.Select(c => c.Value ?? "<null>"));
AutoRestLogger.Warning($"Can't find matching enumvalue '{v.Value}' in '{allValues}'").Wait();
return new EnumValueItem(v.Declaration.Name, "<no matching enum value found>", MgmtReport.Instance.TransformSection);
}
return new EnumValueItem(v.Declaration.Name, inputType.GetFullSerializedName(found), MgmtReport.Instance.TransformSection);
});
MgmtReport.Instance.EnumSection.Add(mi.FullName, mi);
}
else
{
AutoRestLogger.Warning("Model found which is not MgmtObjectType: " + name).Wait();
}
WriteArmModel(project, model, serializeWriter, $"Models/{name}.cs", $"Models/{name}.Serialization.cs");
}
foreach (var client in MgmtContext.Library.RestClients)
{
var restCodeWriter = new CodeWriter();
new MgmtRestClientWriter().WriteClient(restCodeWriter, client);
AddGeneratedFile(project, $"RestOperations/{client.Type.Name}.cs", restCodeWriter.ToString());
}
foreach (var resourceCollection in MgmtContext.Library.ResourceCollections)
{
var writer = new ResourceCollectionWriter(resourceCollection);
writer.Write();
var ri = new ResourceItem(resourceCollection, MgmtReport.Instance.TransformSection);
MgmtReport.Instance.ResourceCollectionSection.Add(ri.Name, ri);
AddGeneratedFile(project, $"{resourceCollection.Type.Name}.cs", writer.ToString());
}
foreach (var model in MgmtContext.Library.ResourceData)
{
if (model == ResourceData.Empty)
continue;
var name = model.Type.Name;
ModelItem mi = new ModelItem(model.Declaration.Namespace, model.Declaration.Name, model.InputModel.Name, MgmtReport.Instance.TransformSection);
mi.Properties = model.Properties.ToDictionary(p => p.Declaration.Name, p =>
{
if (p.InputModelProperty != null)
{
return new PropertyItem(p.Declaration.Name, p.Declaration.Type.GetNameForReport(), model.GetFullSerializedName(p.InputModelProperty), MgmtReport.Instance.TransformSection);
}
else
{
AutoRestLogger.Warning($"Ignore Resource Property '{mi.FullName}.{p.Declaration.Name}' without schema (i.e. AdditionalProperties)").Wait();
return new PropertyItem(p.Declaration.Name, p.Declaration.Type.GetNameForReport(), "<NoPropertySchemaFound>", MgmtReport.Instance.TransformSection);
}
});
MgmtReport.Instance.ModelSection.Add(mi.FullName, mi);
WriteArmModel(project, model, serializeWriter, $"{name}.cs", $"{name}.Serialization.cs");
}
foreach (var resource in MgmtContext.Library.ArmResources)
{
var writer = ResourceWriter.GetWriter(resource);
writer.Write();
var name = resource.Type.Name;
var ri = new ResourceItem(resource, MgmtReport.Instance.TransformSection);
MgmtReport.Instance.ResourceSection.Add(ri.Name, ri);
AddGeneratedFile(project, $"{name}.cs", writer.ToString());
// we do not need this if model reader writer feature is not enabled
if (Configuration.UseModelReaderWriter)
{
WriteSerialization(project, resource, serializeWriter, $"{name}.Serialization.cs");
}
}
var wirePathWriter = new WirePathWriter();
wirePathWriter.Write();
AddGeneratedFile(project, $"Internal/WirePathAttribute.cs", wirePathWriter.ToString());
// write extension class
WriteExtensions(project, isArmCore, MgmtContext.Library.ExtensionWrapper, MgmtContext.Library.Extensions, MgmtContext.Library.MockableExtensions);
var lroWriter = new MgmtLongRunningOperationWriter(true);
lroWriter.Write();
AddGeneratedFile(project, lroWriter.Filename, lroWriter.ToString());
lroWriter = new MgmtLongRunningOperationWriter(false);
lroWriter.Write();
AddGeneratedFile(project, lroWriter.Filename, lroWriter.ToString());
foreach (var operationSource in MgmtContext.Library.OperationSources)
{
var writer = new OperationSourceWriter(operationSource);
writer.Write();
AddGeneratedFile(project, $"LongRunningOperation/{operationSource.Type.Name}.cs", writer.ToString());
}
foreach (var model in MgmtContext.Library.PropertyBagModels)
{
var name = model.Type.Name;
WriteArmModel(project, model, serializeWriter, $"Models/{name}.cs", $"Models/{name}.Serialization.cs");
}
var modelFactoryProvider = MgmtContext.Library.ModelFactory;
if (modelFactoryProvider is not null && modelFactoryProvider.Methods.Any())
{
var modelFactoryWriter = new ModelFactoryWriter(modelFactoryProvider);
modelFactoryWriter.Write();
AddGeneratedFile(project, $"{modelFactoryProvider.Type.Name}.cs", modelFactoryWriter.ToString());
}
// TODO: fix the overriden
//if (_overriddenProjectFilenames.TryGetValue(project, out var overriddenFilenames))
// throw new InvalidOperationException($"At least one file was overridden during the generation process. Filenames are: {string.Join(", ", overriddenFilenames)}");
var modelsToKeep = Configuration.MgmtConfiguration.KeepOrphanedModels.ToImmutableHashSet();
await project.PostProcessAsync(new MgmtPostProcessor(modelsToKeep, modelFactoryProvider?.FullName));
// write samples if enabled
if (Configuration.MgmtTestConfiguration?.Sample ?? Configuration.GenerateSampleProject)
{
string sampleOutputFolder = GetSampleOutputFolder(SAMPLE_DEFAULT_OUTPUT_PATH);
foreach (var sampleProvider in MgmtContext.Library.SampleProviders.Value)
{
var sampleWriter = new CodeWriter();
new ExpressionTypeProviderWriter(sampleWriter, sampleProvider).Write();
project.AddGeneratedTestFile(Path.Combine(sampleOutputFolder, $"Samples/{sampleProvider.Type.Name}.cs"), sampleWriter.ToString());
}
}
}