in telemetry/csharp/AwsToolkit.Telemetry.Events.Generator.Core/DefinitionsBuilder.cs [189:252]
private CodeTypeDeclaration GenerateEnumStruct(MetricType type)
{
var typeDeclaration = new CodeTypeDeclaration(type.GetGeneratedTypeName())
{
IsStruct = true,
TypeAttributes = TypeAttributes.Public | TypeAttributes.Sealed
};
typeDeclaration.Comments.Add(new CodeCommentStatement("Metric field type", true));
if (!string.IsNullOrWhiteSpace(type.description))
{
typeDeclaration.Comments.Add(new CodeCommentStatement(type.description, true));
}
var valueField = new CodeMemberField(typeof(string), "_value");
valueField.Attributes = MemberAttributes.Private;
typeDeclaration.Members.Add(valueField);
// Generate the constructor (stores provided value in _value)
var typeConstructor = new CodeConstructor();
typeConstructor.Attributes = MemberAttributes.Public;
typeConstructor.Parameters.Add(new CodeParameterDeclarationExpression("System.string", "value"));
// this._value = value;
var valueFieldRef = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), valueField.Name);
typeConstructor.Statements.Add(new CodeAssignStatement(valueFieldRef, new CodeArgumentReferenceExpression("value")));
typeDeclaration.Members.Add(typeConstructor);
// Generate static fields for each allowed value
type.allowedValues?
.ToList()
.ForEach(allowedValue =>
{
// eg: public static readonly Runtime Dotnetcore21 = new Runtime("dotnetcore2.1")
CodeMemberField field = new CodeMemberField($"readonly {type.GetGeneratedTypeName()}",
allowedValue.Replace(" ", "_").ToPascalCase().Replace(".", "").Replace("-", ""))
{
InitExpression = new CodeObjectCreateExpression(type.GetGeneratedTypeName(),
new CodeExpression[] {new CodePrimitiveExpression(allowedValue)}),
Attributes = MemberAttributes.Static | MemberAttributes.Public
};
field.Comments.Add(new CodeCommentStatement(allowedValue, true));
typeDeclaration.Members.Add(field);
});
// Generate a ToString method, which returns this._value
// ToString is used by the AddMetadata method
var toString = new CodeMemberMethod()
{
Name = "ToString",
Attributes = MemberAttributes.Public | MemberAttributes.Override,
ReturnType = new CodeTypeReference(typeof(string))
};
toString.Statements.Add(
new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),
valueField.Name)));
typeDeclaration.Members.Add(toString);
return typeDeclaration;
}