OpenAPI Generator Swift5ClientCodegen扩展:Mustache自定义值与属性转义判断
针对OpenAPI Generator Swift5ClientCodegen的自定义模板字段与属性转义判断方案
1. 定义Mustache模板可用自定义值的最优方案
在OpenAPI Generator的架构里,最直接高效的方式是在代码生成逻辑中计算自定义值,并注入到模板渲染的上下文(Context)中,无需依赖复杂的模板端Lambda逻辑。具体操作步骤:
- 找到Swift5客户端代码生成的核心类(比如
Swift5ClientCodegen或它继承的AbstractSwiftCodegen),定位处理模型/数据结构的方法(如processModel、postProcessModels)。 - 遍历当前model的所有属性集合(
allVars),检查是否存在需要转义的属性(判断逻辑对应第二个问题)。 - 给当前model的上下文对象添加自定义布尔字段(比如
hasEscapedPropertyNames),值为是否存在转义属性的判断结果。 - 完成后就能在Mustache模板中直接用
{{#hasEscapedPropertyNames}}...{{/hasEscapedPropertyNames}}做条件渲染。
如果是针对单个属性的自定义标记(比如你示例里的vendorExtensions.x-codegen-escaped-property-name),可以在处理每个属性时,判断该属性是否需要转义,再给属性的上下文添加对应的扩展字段,模板中就能针对单个属性做判断。
2. 判断属性名称是否已被转义
可以从两个维度来判断属性是否需要转义(或已被转义):
维度一:检查是否为Swift保留关键字
OpenAPI Generator的Swift代码生成器内置了保留关键字判断方法isReservedWord(String name)。如果原始属性名是Swift保留字(比如class、enum、struct),生成的属性名会被转义(通常用反引号包裹),这类属性就属于需要标记的转义属性。
维度二:比较格式化后名称与原始名称是否不同
你已经修改了属性名称的格式化逻辑(比如imageUrl→imageURL),可以对比原始属性名(baseName)和经过格式化/ sanitize后的属性名(name):如果两者不一致,说明该属性经过了转义或格式化处理,需要在CodingKeys中添加原始名称的映射。
具体实现的伪代码示例:
// 在属性处理方法中 String originalName = property.getBaseName(); String sanitizedName = sanitizeName(originalName); if (!sanitizedName.equals(originalName) || isReservedWord(originalName)) { // 给属性添加转义标记的vendor扩展 property.getVendorExtensions().put("x-codegen-escaped-property-name", true); }
之后在模板里就能用{{#vendorExtensions.x-codegen-escaped-property-name}}判断单个属性是否需要添加映射。
内容的提问来源于stack exchange,提问作者Reimond Hill
相关产品推荐
相关产品推荐

