ServiceModelSwiftCodeGenerate 是一个基础代码生成库,可用于基于不同的服务模型生成代码。 这个库可以集成到更高级的代码生成应用程序中,并提供一些可以调用的标准生成函数。
ServiceModelSwiftCodeGenerate 使用 Swift Package Manager。 要使用此框架,请将以下依赖项添加到您的 Package.swift 文件中:
dependencies: [
.package(url: "https://github.com/amzn/service-model-swift-code-generate.git", from: "3.0.0")
]
将 ServiceModelSwiftCodeGenerate 集成到更高级的代码生成应用程序中的最简单方法是使用 ServiceModelGenerate.generateFromModel
。 此函数接受一个指向 xml、json 或 yaml 编码的服务模型的文件路径,尝试将该文件解析为所需的服务模型类型,然后将该模型和 ServiceModelCodeGenerator
传递给提供的函数,该函数可以调用任何所需的生成函数。
extension ServiceModelCodeGenerator where TargetSupportType: ModelTargetSupport & ClientTargetSupport {
func generateFromModel<ModelType: ServiceModel>(serviceModel: ModelType,
...) throws {
let myClientDelegate = ...
let myModelErrorsDelegate = ...
let defaultTraceContextType = DefaultTraceContextType(...)
let operationsReportingType = OperationsReportingType(...)
let invocationReportingType = InvocationReportingType(...)
generateClient(delegate: myClientDelegate, fileType: .clientImplementation,
defaultTraceContextType: defaultTraceContextType)
generateModelOperationsEnum()
generateOperationsReporting(operationsReportingType: operationsReportingType)
generateInvocationsReporting(invocationReportingType: invocationReportingType)
generateModelOperationClientInput()
generateModelOperationClientOutput()
generateModelOperationHTTPInput()
generateModelOperationHTTPOutput()
generateModelStructures()
generateModelTypes()
generateModelErrors(delegate: myModelErrorsDelegate)
generateDefaultInstances(generationType: .internalTypes)
// Call any custom generation functions as required
}
}
public struct MyCodeGeneration {
public static func generateFromModel<ModelType: ServiceModel>(
modelFilePath: String,
modelType: ModelType.Type,
customizations: CodeGenerationCustomizations,
applicationDescription: ApplicationDescription,
modelOverride: ModelOverride?,
...) throws
-> ModelType {
return try ServiceModelGenerate.generateFromModel(
modelFilePath: modelFilePath,
customizations: customizations,
applicationDescription: applicationDescription,
modelOverride: modelOverride) { (codeGenerator, serviceModel) in
try codeGenerator.generateFromModel(serviceModel: serviceModel, ...)
}
}
}
默认情况下,代码生成器将使用 \(applicationDescription.baseName)Model
作为模型目标的名称,并使用 \(applicationDescription.baseName)Client
作为客户端目标的名称。 您可以使用 ModelAndClientTargetSupport
类型覆盖这些默认值。
public struct MyCodeGeneration {
public static func generateFromModel<ModelType: ServiceModel>(
modelFilePath: String,
modelType: ModelType.Type,
modelTargetName: String, clientTargetName: String,
customizations: CodeGenerationCustomizations,
applicationDescription: ApplicationDescription,
modelOverride: ModelOverride?,
...) throws
-> ModelType {
let targetSupport = ModelAndClientTargetSupport(modelTargetName: modelTargetName,
clientTargetName: clientTargetName)
return try ServiceModelGenerate.generateFromModel(
modelFilePath: modelFilePath,
customizations: customizations,
applicationDescription: applicationDescription,
targetSupport: targetSupport,
modelOverride: modelOverride) { (codeGenerator, serviceModel) in
try codeGenerator.generateFromModel(serviceModel: serviceModel, ...)
}
}
}
此外,如果您正在生成其他目标,则可以使用自定义类型来提供其他目标的名称。 此类型必须符合 ModelTargetSupport
和 ClientTargetSupport
协议。
extension ServiceModelCodeGenerator where TargetSupportType: ModelTargetSupport & ClientTargetSupport & MyCustomTargetSupport {
func generateFromModel<ModelType: ServiceModel>(serviceModel: ModelType,
...) throws {
let myClientDelegate = ...
let myModelErrorsDelegate = ...
generateClient(delegate: myClientDelegate)
generateModelOperationsEnum()
generateOperationsReporting()
generateModelOperationClientInput()
generateModelOperationClientOutput()
generateModelOperationHTTPInput()
generateModelOperationHTTPOutput()
generateModelStructures()
generateModelTypes()
generateModelErrors(delegate: myModelErrorsDelegate)
generateDefaultInstances(generationType: .internalTypes)
// Call any custom generation functions as required
// The `targetSupport` attribute will conform to the `MyCustomTargetSupport` protocol.
}
}
public protocol MyCustomTargetSupport {
var myCustomTargetName: String { get }
}
public struct MyTargetSupport: ModelTargetSupport, ClientTargetSupport, MyCustomTargetSupport {
public let modelTargetName: String
public let clientTargetName: String
public let myCustomTargetName: String
public init(modelTargetName: String, clientTargetName: String,
myCustomTargetName: String) {
self.modelTargetName = modelTargetName
self.clientTargetName = clientTargetName
self.myCustomTargetName = myCustomTargetName
}
}
public struct MyCodeGeneration {
public static func generateFromModel<ModelType: ServiceModel>(
modelFilePath: String,
modelType: ModelType.Type,
modelTargetName: String, clientTargetName: String,
myCustomTargetName: String,
customizations: CodeGenerationCustomizations,
applicationDescription: ApplicationDescription,
modelOverride: ModelOverride?,
...) throws
-> ModelType {
let targetSupport = MyTargetSupport(modelTargetName: modelTargetName,
clientTargetName: clientTargetName,
myCustomTargetName: myCustomTargetName)
return try ServiceModelGenerate.generateFromModel(
modelFilePath: modelFilePath,
customizations: customizations,
applicationDescription: applicationDescription,
targetSupport: targetSupport,
modelOverride: modelOverride) { (codeGenerator, serviceModel) in
try codeGenerator.generateFromModel(serviceModel: serviceModel, ...)
}
}
}
ServiceModel
协议表示已解析的服务模型,并提供对操作、字段和错误描述的访问。
ModelClientDelegate
协议为服务客户端的创建提供自定义点。
ModelErrorsDelegate
协议为处理从符合服务模型的应用程序端点返回的错误提供自定义点。
ModelOverride
类型提供了覆盖服务模型中的值的机会。
此库采用 Apache 2.0 许可证授权。