@using System.Linq @using AutoRest.Core.Model @inherits AutoRest.Core.Template @Header("// ") @EmptyLine namespace @(Settings.Namespace).@(Settings.ModelsName) { @EmptyLine /// @WrapComment("/// ", "Defines values for " + Model.Name + ".") /// @{var underlyingType = (Model.UnderlyingType?.ClassName == null)? "string" : Model.UnderlyingType.ClassName; var hasAllowedValues = Model.Values.Any(val=>val.AllowedValues.Any());} /// @WrapComment("/// ", "Determine base value for a given allowed value if exists, else return the value itself") /// [Newtonsoft.Json.JsonConverter(typeof(@(Model.ClassName + "Converter")))] @(Model.GetObsoleteAttribute()) public struct @Model.ClassName : System.IEquatable<@Model.ClassName> { private @Model.ClassName@("("+underlyingType) underlyingValue) { UnderlyingValue=underlyingValue; } @EmptyLine @foreach (var t in Model.Values) { if (t.Description != null) { /// @WrapComment("/// ", t.Description) /// } var initName = (underlyingType == "string") ? "\""+t.SerializedName+"\"": t.SerializedName; public static readonly @Model.ClassName @t.MemberName = @(initName); @EmptyLine } @if(hasAllowedValues) { @:@EmptyLine @:/// @:@WrapComment("/// ", "Determine base value for a given allowed value if exists, else return the value itself") @:/// @:private static @underlyingType GetBaseValueForAllowedValue(@underlyingType value) @:{ @:switch(value) @:{ @foreach(var enumValue in Model.Values) { @if(enumValue.AllowedValues.Any()) { @foreach(var allowedValue in enumValue.AllowedValues) { @:case @((underlyingType=="string")? "\""+allowedValue+"\"":allowedValue): } @:return @((underlyingType=="string")? "\""+enumValue.Name+"\"": enumValue.Name); } } @:default: @:return value; @:} @:} } @EmptyLine /// @WrapComment("/// ", "Underlying value of enum "+Model.ClassName) /// private readonly @underlyingType UnderlyingValue; @EmptyLine /// @WrapComment("/// ", "Returns string representation for "+Model.ClassName) /// public override string ToString() { return UnderlyingValue == null ? null : UnderlyingValue.ToString(); } @EmptyLine /// @WrapComment("/// ", "Compares enums of type "+Model.ClassName) /// public bool Equals(@Model.ClassName e) { return @((hasAllowedValues)? "GetBaseValueForAllowedValue(e.UnderlyingValue).Equals(GetBaseValueForAllowedValue(UnderlyingValue))" : "UnderlyingValue.Equals(e.UnderlyingValue)"); } @EmptyLine /// @WrapComment("/// ", "Implicit operator to convert "+underlyingType+" to "+Model.ClassName) /// public static implicit operator @(Model.ClassName +"("+ underlyingType +" value)") { return new @(Model.ClassName+"(value)"); } @EmptyLine /// @WrapComment("/// ", "Implicit operator to convert "+Model.ClassName+" to "+underlyingType) /// public static implicit operator string(@Model.ClassName e) { return e.UnderlyingValue; } @EmptyLine /// @WrapComment("/// ", "Overriding == operator for enum "+Model.ClassName) /// public static bool operator == (@Model.ClassName e1, @Model.ClassName e2) { return e2.Equals(e1); } @EmptyLine /// @WrapComment("/// ", "Overriding != operator for enum "+Model.ClassName) /// public static bool operator != (@Model.ClassName e1, @Model.ClassName e2) { return !e2.Equals(e1); } @EmptyLine /// @WrapComment("/// ", "Overrides Equals operator for "+Model.ClassName) /// public override bool Equals(object obj) { return obj is @Model.ClassName && this.Equals((@Model.ClassName)obj); } @EmptyLine /// @WrapComment("/// ", "Returns for hashCode "+Model.ClassName) /// public override int GetHashCode() { return @((hasAllowedValues)? "GetBaseValueForAllowedValue(UnderlyingValue).GetHashCode()" :"UnderlyingValue.GetHashCode()"); } @EmptyLine } }