Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 49 additions & 6 deletions Sources/SotoCodeGeneratorLib/AwsService+shapes.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,11 @@ extension AwsService {
model
.select(type: EnumShape.self)
.compactMap { self.generateEnumContext($0.value, shapeName: $0.key.shapeName) }
let enums = (traitEnums + shapeEnums).sorted { $0.name < $1.name }
let intEnums: [EnumContext] =
model
.select(type: IntEnumShape.self)
.compactMap { self.generateIntEnumContext($0.value, shapeName: $0.key.shapeName) }
let enums = (traitEnums + shapeEnums + intEnums).sorted { $0.name < $1.name }
var shapeContexts: [ShapesContext.ShapeType] = enums.map { .enum($0) }

// generate structures
Expand Down Expand Up @@ -81,7 +85,8 @@ extension AwsService {
return EnumContext(
name: shapeName.toSwiftClassCase(),
documentation: processDocs(from: shape),
values: valueContexts,
stringValues: .init(values: valueContexts),
intValues: nil,
isExtensible: shape.hasTrait(type: SotoExtensibleEnumTrait.self)
)
}
Expand All @@ -103,9 +108,8 @@ extension AwsService {
switch enumValueTrait.value {
case .string(let name):
value = name
case .integer(let integer):
value = integer.description
fatalError("intEnum is currently not supported")
case .integer:
fatalError("String enumerations shouldn't have integer based values")
}
} else {
value = enumerated.element.key
Expand All @@ -120,7 +124,46 @@ extension AwsService {
return EnumContext(
name: shapeName.toSwiftClassCase(),
documentation: processDocs(from: enumShape),
values: valueContexts.sorted { $0.case < $1.case },
stringValues: .init(values: valueContexts.sorted { $0.case < $1.case }),
intValues: nil,
isExtensible: enumShape.hasTrait(type: SotoExtensibleEnumTrait.self)
)
}

/// Generate the context information for outputting an enum from strings with enum traits
func generateIntEnumContext(_ enumShape: IntEnumShape, shapeName: String) -> EnumContext? {
let usedInInput = enumShape.hasTrait(type: SotoInputShapeTrait.self)
let usedInOutput = enumShape.hasTrait(type: SotoOutputShapeTrait.self)
guard usedInInput || usedInOutput else { return nil }
guard let members = enumShape.members else { return nil }
// Operations
let valueContexts: [IntEnumMemberContext] = members.enumerated().map { enumerated -> IntEnumMemberContext in
var key = enumerated.element.key.toSwiftEnumCase()
if key.allLetterIsNumeric() {
key = "\(shapeName.toSwiftVariableCase())\(key)"
}
let value: Int
let enumValueTrait = enumerated.element.value.trait(type: EnumValueTrait.self)
switch enumValueTrait?.value {
case .string:
fatalError("Int enumerations shouldn't have string based values")
case .integer(let integer):
value = integer
case .none:
fatalError("Int enumerations require integer value")
}
let documentation = enumerated.element.value.trait(type: DocumentationTrait.self)
return IntEnumMemberContext(
case: key,
documentation: documentation.map { processDocs($0.value) } ?? [],
rawValue: value
)
}
return EnumContext(
name: shapeName.toSwiftClassCase(),
documentation: processDocs(from: enumShape),
stringValues: nil,
intValues: .init(values: valueContexts.sorted { $0.case < $1.case }),
isExtensible: enumShape.hasTrait(type: SotoExtensibleEnumTrait.self)
)
}
Expand Down
15 changes: 14 additions & 1 deletion Sources/SotoCodeGeneratorLib/AwsService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -855,9 +855,16 @@ extension AwsService {
}

struct EnumContext {
struct IntValues {
let values: [IntEnumMemberContext]
}
struct StringValues {
let values: [EnumMemberContext]
}
let name: String
let documentation: [String.SubSequence]
let values: [EnumMemberContext]
let stringValues: StringValues?
let intValues: IntValues?
let isExtensible: Bool
}

Expand All @@ -867,6 +874,12 @@ extension AwsService {
let rawValue: String
}

struct IntEnumMemberContext {
let `case`: String
let documentation: [String.SubSequence]
let rawValue: Int
}

struct ArrayEncodingPropertiesContext: EncodingPropertiesContext {
let name: String
let member: String
Expand Down
10 changes: 5 additions & 5 deletions Sources/SotoCodeGeneratorLib/Model+Patch.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ extension Model {
patch: AddTraitPatch(trait: EnumTrait(value: .init([.init(value: "HTTP1_1"), .init(value: "HTTP2")])))
),
"com.amazonaws.cloudfront#DistributionSummary$HttpVersion": EditShapePatch { (shape: MemberShape) in
return MemberShape(target: "com.amazonaws.cloudfront#UppercaseHttpVersion", traits: shape.traits)
MemberShape(target: "com.amazonaws.cloudfront#UppercaseHttpVersion", traits: shape.traits)
},
],
"CloudWatch": [
Expand All @@ -67,7 +67,7 @@ extension Model {
"DynamoDB": [
// Make TransactWriteItem an enum with associated values
"com.amazonaws.dynamodb#TransactWriteItem": EditShapePatch { (shape: StructureShape) in
return UnionShape(traits: shape.traits, members: shape.members)
UnionShape(traits: shape.traits, members: shape.members)
}
],
"EC2": [
Expand Down Expand Up @@ -116,7 +116,7 @@ extension Model {
)
),
"com.amazonaws.lambda#ListFunctionsRequest$MasterRegion": EditShapePatch { (shape: MemberShape) in
return MemberShape(target: "com.amazonaws.lambda#SotoCore.Region", traits: shape.traits)
MemberShape(target: "com.amazonaws.lambda#SotoCore.Region", traits: shape.traits)
},
// https://github.com/soto-project/soto/issues/720
"com.amazonaws.lambda#LastUpdateStatusReasonCode": AddShapeMemberPatch<EnumShape>(
Expand All @@ -134,7 +134,7 @@ extension Model {
],
"RDSData": [
// See https://github.com/soto-project/soto/issues/471
"com.amazonaws.rdsdata#Arn": EditTraitPatch { trait in return LengthTrait(min: trait.min, max: 2048) }
"com.amazonaws.rdsdata#Arn": EditTraitPatch { trait in LengthTrait(min: trait.min, max: 2048) }
],
"Route53": [
// pagination tokens in response shouldnt be required
Expand All @@ -144,7 +144,7 @@ extension Model {
],
"S3": [
// https://github.com/soto-project/soto/issues/311
"com.amazonaws.s3#CopySource": EditTraitPatch { _ in return PatternTrait(value: ".+\\/.+") },
"com.amazonaws.s3#CopySource": EditTraitPatch { _ in PatternTrait(value: ".+\\/.+") },
"com.amazonaws.s3#LifecycleRule$Filter": AddTraitPatch(trait: RequiredTrait()),
// https://github.com/soto-project/soto/issues/502
"com.amazonaws.s3#BucketLocationConstraint": MultiplePatch(
Expand Down
17 changes: 15 additions & 2 deletions Sources/SotoCodeGeneratorLib/Templates/enum.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,16 @@ extension Templates {
self.rawValue = rawValue
}

{{#values}}
{{#stringValues.values}}
{{#documentation}}
{{>comment}}
{{/documentation}}
{{scope}} static var {{case}}: Self { .init(rawValue: "{{rawValue}}") }
{{/values}}
{{/stringValues.values}}
}
{{/isExtensible}}
{{^isExtensible}}
{{#stringValues}}
{{scope}} enum {{name}}: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
{{#values}}
{{#documentation}}
Expand All @@ -41,6 +42,18 @@ extension Templates {
{{/values}}
{{scope}} var description: String { return self.rawValue }
}
{{/stringValues}}
{{#intValues}}
{{scope}} enum {{name}}: Int, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
{{#values}}
{{#documentation}}
{{>comment}}
{{/documentation}}
case {{case}} = {{rawValue}}
{{/values}}
{{scope}} var description: String { return "\\(self.rawValue)" }
}
{{/intValues}}
{{/isExtensible}}

"""
Expand Down