diff --git a/src/generators/csharp/renderers/EnumRenderer.ts b/src/generators/csharp/renderers/EnumRenderer.ts index 05ca25f0bd..d17d43028a 100644 --- a/src/generators/csharp/renderers/EnumRenderer.ts +++ b/src/generators/csharp/renderers/EnumRenderer.ts @@ -9,13 +9,34 @@ import { pascalCase } from 'change-case'; */ export class EnumRenderer extends CSharpRenderer { async defaultSelf(): Promise { - const content = [ - await this.renderItems(), - ]; + const enumItems = await this.renderItems(); const formattedName = this.nameType(this.model.$id); + const getValueCaseItemValues = await this.getValueCaseItemValues(); + const toEnumCaseItemValues = await this.toEnumCaseItemValues(); return `public enum ${formattedName} { -${this.indent(this.renderBlock(content, 2))} -}`; +${this.indent(enumItems)} +} +public static class ${formattedName}Extensions { + public static dynamic GetValue(this ${formattedName} enumValue) + { + switch (enumValue) + { +${this.indent(getValueCaseItemValues, 6)} + } + return null; + } + + public static ${formattedName}? To${formattedName}(dynamic value) + { + switch (value) + { +${this.indent(toEnumCaseItemValues, 6)} + } + return null; + } +} + +`; } async renderItems(): Promise { @@ -31,6 +52,51 @@ ${this.indent(this.renderBlock(content, 2))} return `${content}`; } + /** + * Some enum values require custom value conversion + */ + getEnumValue(enumValue: any): any { + switch (typeof enumValue) { + case 'number': + case 'bigint': + case 'boolean': + return enumValue; + case 'object': + return `"${JSON.stringify(enumValue).replace(/"/g, '\\"')}"`; + default: + return `"${enumValue}"`; + } + } + + async toEnumCaseItemValues(): Promise { + const enums = this.model.enum || []; + const items: string[] = []; + const formattedName = this.nameType(this.model.$id); + + for (const enumValue of enums) { + const renderedItem = await this.runItemPreset(enumValue); + const value = this.getEnumValue(enumValue); + items.push(`case ${value}: return ${formattedName}.${renderedItem};`); + } + + const content = items.join('\n'); + return `${content}`; + } + async getValueCaseItemValues(): Promise { + const enums = this.model.enum || []; + const items: string[] = []; + const formattedName = this.nameType(this.model.$id); + + for (const enumValue of enums) { + const renderedItem = await this.runItemPreset(enumValue); + const value = this.getEnumValue(enumValue); + items.push(`case ${formattedName}.${renderedItem}: return ${value};`); + } + + const content = items.join('\n'); + return `${content}`; + } + runItemPreset(item: any): Promise { return this.runPreset('item', { item }); } diff --git a/test/generators/csharp/__snapshots__/CSharpGenerator.spec.ts.snap b/test/generators/csharp/__snapshots__/CSharpGenerator.spec.ts.snap index 413efcebfe..e1fb29c53d 100644 --- a/test/generators/csharp/__snapshots__/CSharpGenerator.spec.ts.snap +++ b/test/generators/csharp/__snapshots__/CSharpGenerator.spec.ts.snap @@ -191,25 +191,129 @@ exports[`CSharpGenerator should render \`class\` type 2`] = ` exports[`CSharpGenerator should render \`enum\` type $name should not be empty 1`] = ` "public enum States { Texas, Alabama, California -}" +} +public static class StatesExtensions { + public static dynamic GetValue(this States enumValue) + { + switch (enumValue) + { + case States.Texas: return \\"Texas\\"; + case States.Alabama: return \\"Alabama\\"; + case States.California: return \\"California\\"; + } + return null; + } + + public static States? ToStates(dynamic value) + { + switch (value) + { + case \\"Texas\\": return States.Texas; + case \\"Alabama\\": return States.Alabama; + case \\"California\\": return States.California; + } + return null; + } +} + +" `; exports[`CSharpGenerator should render \`enum\` type $name should not be empty 2`] = ` "public enum States { Texas, Alabama, California -}" +} +public static class StatesExtensions { + public static dynamic GetValue(this States enumValue) + { + switch (enumValue) + { + case States.Texas: return \\"Texas\\"; + case States.Alabama: return \\"Alabama\\"; + case States.California: return \\"California\\"; + } + return null; + } + + public static States? ToStates(dynamic value) + { + switch (value) + { + case \\"Texas\\": return States.Texas; + case \\"Alabama\\": return States.Alabama; + case \\"California\\": return States.California; + } + return null; + } +} + +" `; exports[`CSharpGenerator should render \`enum\` type $name should not be empty 3`] = ` "public enum Things { Texas, Number_1, False, TestTest -}" +} +public static class ThingsExtensions { + public static dynamic GetValue(this Things enumValue) + { + switch (enumValue) + { + case Things.Texas: return \\"Texas\\"; + case Things.Number_1: return 1; + case Things.False: return false; + case Things.TestTest: return \\"{\\\\\\"test\\\\\\":\\\\\\"test\\\\\\"}\\"; + } + return null; + } + + public static Things? ToThings(dynamic value) + { + switch (value) + { + case \\"Texas\\": return Things.Texas; + case 1: return Things.Number_1; + case false: return Things.False; + case \\"{\\\\\\"test\\\\\\":\\\\\\"test\\\\\\"}\\": return Things.TestTest; + } + return null; + } +} + +" `; exports[`CSharpGenerator should render \`enum\` type $name should not be empty 4`] = ` "public enum Things { Texas, Number_1, False, TestTest -}" +} +public static class ThingsExtensions { + public static dynamic GetValue(this Things enumValue) + { + switch (enumValue) + { + case Things.Texas: return \\"Texas\\"; + case Things.Number_1: return 1; + case Things.False: return false; + case Things.TestTest: return \\"{\\\\\\"test\\\\\\":\\\\\\"test\\\\\\"}\\"; + } + return null; + } + + public static Things? ToThings(dynamic value) + { + switch (value) + { + case \\"Texas\\": return Things.Texas; + case 1: return Things.Number_1; + case false: return Things.False; + case \\"{\\\\\\"test\\\\\\":\\\\\\"test\\\\\\"}\\": return Things.TestTest; + } + return null; + } +} + +" `; exports[`CSharpGenerator should work custom preset for \`class\` type 1`] = ` @@ -234,11 +338,61 @@ exports[`CSharpGenerator should work custom preset for \`class\` type 1`] = ` exports[`CSharpGenerator should work custom preset for \`enum\` type 1`] = ` "public enum CustomEnum { Texas, Alabama, California -}" +} +public static class CustomEnumExtensions { + public static dynamic GetValue(this CustomEnum enumValue) + { + switch (enumValue) + { + case CustomEnum.Texas: return \\"Texas\\"; + case CustomEnum.Alabama: return \\"Alabama\\"; + case CustomEnum.California: return \\"California\\"; + } + return null; + } + + public static CustomEnum? ToCustomEnum(dynamic value) + { + switch (value) + { + case \\"Texas\\": return CustomEnum.Texas; + case \\"Alabama\\": return CustomEnum.Alabama; + case \\"California\\": return CustomEnum.California; + } + return null; + } +} + +" `; exports[`CSharpGenerator should work custom preset for \`enum\` type 2`] = ` "public enum CustomEnum { Texas, Alabama, California -}" +} +public static class CustomEnumExtensions { + public static dynamic GetValue(this CustomEnum enumValue) + { + switch (enumValue) + { + case CustomEnum.Texas: return \\"Texas\\"; + case CustomEnum.Alabama: return \\"Alabama\\"; + case CustomEnum.California: return \\"California\\"; + } + return null; + } + + public static CustomEnum? ToCustomEnum(dynamic value) + { + switch (value) + { + case \\"Texas\\": return CustomEnum.Texas; + case \\"Alabama\\": return CustomEnum.Alabama; + case \\"California\\": return CustomEnum.California; + } + return null; + } +} + +" `;