@@ -28,7 +28,11 @@ extension AwsService {
2828 model
2929 . select ( type: EnumShape . self)
3030 . compactMap { self . generateEnumContext ( $0. value, shapeName: $0. key. shapeName) }
31- let enums = ( traitEnums + shapeEnums) . sorted { $0. name < $1. name }
31+ let intEnums : [ EnumContext ] =
32+ model
33+ . select ( type: IntEnumShape . self)
34+ . compactMap { self . generateIntEnumContext ( $0. value, shapeName: $0. key. shapeName) }
35+ let enums = ( traitEnums + shapeEnums + intEnums) . sorted { $0. name < $1. name }
3236 var shapeContexts : [ ShapesContext . ShapeType ] = enums. map { . enum( $0) }
3337
3438 // generate structures
@@ -81,7 +85,8 @@ extension AwsService {
8185 return EnumContext (
8286 name: shapeName. toSwiftClassCase ( ) ,
8387 documentation: processDocs ( from: shape) ,
84- values: valueContexts,
88+ stringValues: . init( values: valueContexts) ,
89+ intValues: nil ,
8590 isExtensible: shape. hasTrait ( type: SotoExtensibleEnumTrait . self)
8691 )
8792 }
@@ -103,9 +108,8 @@ extension AwsService {
103108 switch enumValueTrait. value {
104109 case . string( let name) :
105110 value = name
106- case . integer( let integer) :
107- value = integer. description
108- fatalError ( " intEnum is currently not supported " )
111+ case . integer:
112+ fatalError ( " String enumerations shouldn't have integer based values " )
109113 }
110114 } else {
111115 value = enumerated. element. key
@@ -120,7 +124,46 @@ extension AwsService {
120124 return EnumContext (
121125 name: shapeName. toSwiftClassCase ( ) ,
122126 documentation: processDocs ( from: enumShape) ,
123- values: valueContexts. sorted { $0. case < $1. case } ,
127+ stringValues: . init( values: valueContexts. sorted { $0. case < $1. case } ) ,
128+ intValues: nil ,
129+ isExtensible: enumShape. hasTrait ( type: SotoExtensibleEnumTrait . self)
130+ )
131+ }
132+
133+ /// Generate the context information for outputting an enum from strings with enum traits
134+ func generateIntEnumContext( _ enumShape: IntEnumShape , shapeName: String ) -> EnumContext ? {
135+ let usedInInput = enumShape. hasTrait ( type: SotoInputShapeTrait . self)
136+ let usedInOutput = enumShape. hasTrait ( type: SotoOutputShapeTrait . self)
137+ guard usedInInput || usedInOutput else { return nil }
138+ guard let members = enumShape. members else { return nil }
139+ // Operations
140+ let valueContexts : [ IntEnumMemberContext ] = members. enumerated ( ) . map { enumerated -> IntEnumMemberContext in
141+ var key = enumerated. element. key. toSwiftEnumCase ( )
142+ if key. allLetterIsNumeric ( ) {
143+ key = " \( shapeName. toSwiftVariableCase ( ) ) \( key) "
144+ }
145+ let value : Int
146+ let enumValueTrait = enumerated. element. value. trait ( type: EnumValueTrait . self)
147+ switch enumValueTrait? . value {
148+ case . string:
149+ fatalError ( " Int enumerations shouldn't have string based values " )
150+ case . integer( let integer) :
151+ value = integer
152+ case . none:
153+ fatalError ( " Int enumerations require integer value " )
154+ }
155+ let documentation = enumerated. element. value. trait ( type: DocumentationTrait . self)
156+ return IntEnumMemberContext (
157+ case: key,
158+ documentation: documentation. map { processDocs ( $0. value) } ?? [ ] ,
159+ rawValue: value
160+ )
161+ }
162+ return EnumContext (
163+ name: shapeName. toSwiftClassCase ( ) ,
164+ documentation: processDocs ( from: enumShape) ,
165+ stringValues: nil ,
166+ intValues: . init( values: valueContexts. sorted { $0. case < $1. case } ) ,
124167 isExtensible: enumShape. hasTrait ( type: SotoExtensibleEnumTrait . self)
125168 )
126169 }
0 commit comments