Build - main Branch Swift 5.6, 5.7 and 5.8 Tested Join the Smoke Server Side community on gitter Apache 2

ServiceModelSwiftCodeGenerate

ServiceModelSwiftCodeGenerate 是一个基础代码生成库,可用于基于不同的服务模型生成代码。 这个库可以集成到更高级的代码生成应用程序中,并提供一些可以调用的标准生成函数。

入门指南

步骤 1:添加 ServiceModelSwiftCodeGenerate 依赖项

ServiceModelSwiftCodeGenerate 使用 Swift Package Manager。 要使用此框架,请将以下依赖项添加到您的 Package.swift 文件中:

dependencies: [
    .package(url: "https://github.com/amzn/service-model-swift-code-generate.git", from: "3.0.0")
]

步骤 2:使用该库生成代码

将 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, ...)
        }
    }
}

此外,如果您正在生成其他目标,则可以使用自定义类型来提供其他目标的名称。 此类型必须符合 ModelTargetSupportClientTargetSupport 协议。

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 协议

ServiceModel 协议表示已解析的服务模型,并提供对操作、字段和错误描述的访问。

ModelClientDelegate 协议

ModelClientDelegate 协议为服务客户端的创建提供自定义点。

ModelErrorsDelegate 协议

ModelErrorsDelegate 协议为处理从符合服务模型的应用程序端点返回的错误提供自定义点。

ModelOverride 类型

ModelOverride 类型提供了覆盖服务模型中的值的机会。

许可证

此库采用 Apache 2.0 许可证授权。