-
-
Notifications
You must be signed in to change notification settings - Fork 7.3k
Add Nim client code generator #3879
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 45 commits
f266380
18d367a
9639569
a999b5e
5d73b11
3880039
c48f0a0
c5e4713
feb96b1
5fdc0ab
ae33303
ba35508
fc74ece
7b4a201
2451702
9ef73eb
c90c6c8
bdfed92
7c5cfb7
99eb680
ac1f19d
9cbcebc
9ba0dd0
5d21a8f
8c637fb
f26f726
4a1eb91
3228ca2
2fb08fb
221443a
adf1297
86adb0a
82f00f2
0f10987
bf441c2
e51ffbe
0396bb4
3dd0ebd
58ec946
580ca11
fbb3b27
549fc8f
bface47
5a28be0
19cc13b
2db44c7
bcec49b
7276034
090875b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| #!/bin/sh | ||
|
|
||
| SCRIPT="$0" | ||
|
|
||
| while [ -h "$SCRIPT" ] ; do | ||
| ls=$(ls -ld "$SCRIPT") | ||
| link=$(expr "$ls" : '.*-> \(.*\)$') | ||
| if expr "$link" : '/.*' > /dev/null; then | ||
| SCRIPT="$link" | ||
| else | ||
| SCRIPT=$(dirname "$SCRIPT")/"$link" | ||
| fi | ||
| done | ||
|
|
||
| if [ ! -d "${APP_DIR}" ]; then | ||
| APP_DIR=$(dirname "$SCRIPT")/.. | ||
| APP_DIR=$(cd "${APP_DIR}"; pwd) | ||
| fi | ||
|
|
||
| executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" | ||
|
|
||
| if [ ! -f "$executable" ] | ||
| then | ||
| mvn clean package | ||
| fi | ||
|
|
||
| # if you've executed sbt assembly previously it will use that instead. | ||
| export JAVA_OPTS="${JAVA_OPTS} -Xmx1024M -DloggerPath=conf/log4j.properties" | ||
| ags="$@ generate -t modules/openapi-generator/src/main/resources/nim-client -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml --additional-properties packageName=petstore -g nim -o samples/client/petstore/nim" | ||
|
|
||
| java ${JAVA_OPTS} -jar ${executable} ${ags} | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| set executable=.\modules\openapi-generator-cli\target\openapi-generator-cli.jar | ||
|
|
||
| If Not Exist %executable% ( | ||
| mvn clean package | ||
| ) | ||
|
|
||
| REM set JAVA_OPTS=%JAVA_OPTS% -Xmx1024M -DloggerPath=conf/log4j.properties | ||
| set ags=generate --artifact-id "nim-petstore-client" -i modules\openapi-generator\src\test\resources\2_0\petstore.yaml --additional-properties packageName=petstore -g nim -o samples\client\petstore\nim | ||
|
|
||
| java %JAVA_OPTS% -jar %executable% %ags% |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,309 @@ | ||
| package org.openapitools.codegen.languages; | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'll add the copyright header in another PR. |
||
|
|
||
| import io.swagger.v3.oas.models.media.ArraySchema; | ||
| import io.swagger.v3.oas.models.media.Schema; | ||
| import io.swagger.v3.oas.models.media.StringSchema; | ||
| import org.openapitools.codegen.*; | ||
| import org.openapitools.codegen.utils.ModelUtils; | ||
| import org.openapitools.codegen.utils.StringUtils; | ||
| import org.slf4j.Logger; | ||
| import org.slf4j.LoggerFactory; | ||
|
|
||
| import java.io.File; | ||
| import java.util.*; | ||
|
|
||
| import static org.openapitools.codegen.utils.StringUtils.camelize; | ||
| import static org.openapitools.codegen.utils.StringUtils.underscore; | ||
|
|
||
| public class NimClientCodegen extends DefaultCodegen implements CodegenConfig { | ||
| static Logger LOGGER = LoggerFactory.getLogger(NimClientCodegen.class); | ||
|
|
||
| public static final String PROJECT_NAME = "projectName"; | ||
|
|
||
| protected String packageName = "openapiclient"; | ||
| protected String packageVersion = "1.0.0"; | ||
|
|
||
| public CodegenType getTag() { | ||
| return CodegenType.CLIENT; | ||
| } | ||
|
|
||
| public String getName() { | ||
| return "nim"; | ||
| } | ||
|
|
||
| public String getHelp() { | ||
| return "Generates a nim client."; | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'll add the word "beta" as follows:
|
||
| } | ||
|
|
||
| public NimClientCodegen() { | ||
| super(); | ||
|
|
||
| outputFolder = "generated-code" + File.separator + "nim"; | ||
| modelTemplateFiles.put("model.mustache", ".nim"); | ||
| apiTemplateFiles.put("api.mustache", ".nim"); | ||
| embeddedTemplateDir = templateDir = "nim-client"; | ||
| apiPackage = File.separator + packageName + File.separator + "apis"; | ||
| modelPackage = File.separator + packageName + File.separator + "models"; | ||
| supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); | ||
| supportingFiles.add(new SupportingFile("sample_client.mustache", "", "sample_client.nim")); | ||
| supportingFiles.add(new SupportingFile("config.mustache", "", "config.nim")); | ||
|
|
||
| setReservedWordsLowerCase( | ||
| Arrays.asList( | ||
| "addr", "and", "as", "asm", | ||
| "bind", "block", "break", | ||
| "case", "cast", "concept", "const", "continue", "converter", | ||
| "defer", "discard", "distinct", "div", "do", | ||
| "elif", "else", "end", "enum", "except", "export", | ||
| "finally", "for", "from", "func", | ||
| "if", "import", "in", "include", "interface", "is", "isnot", "iterator", | ||
| "let", | ||
| "macro", "method", "mixin", "mod", | ||
| "nil", "not", "notin", | ||
| "object", "of", "or", "out", | ||
| "proc", "ptr", | ||
| "raise", "ref", "return", | ||
| "shl", "shr", "static", | ||
| "template", "try", "tuple", "type", | ||
| "using", | ||
| "var", | ||
| "when", "while", | ||
| "xor", | ||
| "yield" | ||
| ) | ||
| ); | ||
|
|
||
| defaultIncludes = new HashSet<String>( | ||
| Arrays.asList( | ||
| "array" | ||
| ) | ||
| ); | ||
|
|
||
| languageSpecificPrimitives = new HashSet<String>( | ||
| Arrays.asList( | ||
| "int", | ||
| "int8", | ||
| "int16", | ||
| "int32", | ||
| "int64", | ||
| "uint", | ||
| "uint8", | ||
| "uint16", | ||
| "uint32", | ||
| "uint64", | ||
| "float", | ||
| "float32", | ||
| "float64", | ||
| "bool", | ||
| "char", | ||
| "string", | ||
| "cstring", | ||
| "pointer") | ||
| ); | ||
|
|
||
| typeMapping.clear(); | ||
| typeMapping.put("integer", "int"); | ||
| typeMapping.put("long", "int64"); | ||
| typeMapping.put("number", "float"); | ||
| typeMapping.put("float", "float"); | ||
| typeMapping.put("double", "float64"); | ||
| typeMapping.put("boolean", "bool"); | ||
| typeMapping.put("UUID", "string"); | ||
| typeMapping.put("URI", "string"); | ||
| typeMapping.put("date", "string"); | ||
| typeMapping.put("DateTime", "string"); | ||
| typeMapping.put("password", "string"); | ||
| typeMapping.put("file", "string"); | ||
| } | ||
|
|
||
| public void setPackageName(String packageName) { | ||
| this.packageName = packageName; | ||
| } | ||
|
|
||
| public void setPackageVersion(String packageVersion) { | ||
| this.packageVersion = packageVersion; | ||
| } | ||
|
|
||
| @Override | ||
| public Map<String, Object> postProcessModels(Map<String, Object> objs) { | ||
| return postProcessModelsEnum(objs); | ||
| } | ||
|
|
||
| @Override | ||
| public void processOpts() { | ||
| super.processOpts(); | ||
|
|
||
| if (additionalProperties.containsKey(CodegenConstants.PACKAGE_NAME)) { | ||
| setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME)); | ||
| } | ||
|
|
||
| if (additionalProperties.containsKey(CodegenConstants.PACKAGE_VERSION)) { | ||
| setPackageVersion((String) additionalProperties.get(CodegenConstants.PACKAGE_VERSION)); | ||
| } | ||
|
|
||
| additionalProperties.put(CodegenConstants.PACKAGE_NAME, packageName); | ||
| additionalProperties.put(CodegenConstants.PACKAGE_VERSION, packageVersion); | ||
|
|
||
| apiPackage = File.separator + packageName + File.separator + "apis"; | ||
| modelPackage = File.separator + packageName + File.separator + "models"; | ||
| supportingFiles.add(new SupportingFile("lib.mustache", "", packageName + ".nim")); | ||
| } | ||
|
|
||
| @Override | ||
| public String escapeReservedWord(String name) { | ||
| LOGGER.warn("A reserved word \"" + name + "\" is used. Consider renaming the field name"); | ||
| if (this.reservedWordsMappings().containsKey(name)) { | ||
| return this.reservedWordsMappings().get(name); | ||
| } | ||
| return "`" + name + "`"; | ||
| } | ||
|
|
||
| @Override | ||
| public String escapeQuotationMark(String input) { | ||
| return input.replace("\"", ""); | ||
| } | ||
|
|
||
| @Override | ||
| public String escapeUnsafeCharacters(String input) { | ||
| return input.replace("*/", "*_/").replace("/*", "/_*"); | ||
| } | ||
|
|
||
| @Override | ||
| public String toModelImport(String name) { | ||
| name = name.replaceAll("-", "_"); | ||
| if (importMapping.containsKey(name)) { | ||
| return "model_" + StringUtils.underscore(importMapping.get(name)); | ||
| } else { | ||
| return "model_" + StringUtils.underscore(name); | ||
| } | ||
| } | ||
|
|
||
| @Override | ||
| public String toApiImport(String name) { | ||
| name = name.replaceAll("-", "_"); | ||
| if (importMapping.containsKey(name)) { | ||
| return "api_" + StringUtils.underscore(importMapping.get(name)); | ||
| } else { | ||
| return "api_" + StringUtils.underscore(name); | ||
| } | ||
| } | ||
|
|
||
| @Override | ||
| public String toModelFilename(String name) { | ||
| name = name.replaceAll("-", "_"); | ||
| return "model_" + StringUtils.underscore(name); | ||
| } | ||
|
|
||
| @Override | ||
| public String toApiFilename(String name) { | ||
| name = name.replaceAll("-", "_"); | ||
| return "api_" + StringUtils.underscore(name); | ||
| } | ||
|
|
||
| @Override | ||
| public String toOperationId(String operationId) { | ||
| String sanitizedOperationId = sanitizeName(operationId); | ||
|
|
||
| if (isReservedWord(sanitizedOperationId)) { | ||
| sanitizedOperationId = "call" + StringUtils.camelize(sanitizedOperationId, false); | ||
| } | ||
|
|
||
| return StringUtils.camelize(sanitizedOperationId, true); | ||
| } | ||
|
|
||
| @Override | ||
| public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> objs, List<Object> allModels) { | ||
| @SuppressWarnings("unchecked") | ||
| Map<String, Object> objectMap = (Map<String, Object>) objs.get("operations"); | ||
| @SuppressWarnings("unchecked") | ||
| List<CodegenOperation> operations = (List<CodegenOperation>) objectMap.get("operation"); | ||
| for (CodegenOperation operation : operations) { | ||
| operation.httpMethod = operation.httpMethod.toLowerCase(Locale.ROOT); | ||
| } | ||
|
|
||
| return objs; | ||
| } | ||
|
|
||
| @Override | ||
| public String getTypeDeclaration(Schema p) { | ||
| if (ModelUtils.isArraySchema(p)) { | ||
| ArraySchema ap = (ArraySchema) p; | ||
| Schema inner = ap.getItems(); | ||
| if (inner == null) { | ||
| return null; | ||
| } | ||
| return "seq[" + getTypeDeclaration(inner) + "]"; | ||
| } else if (ModelUtils.isMapSchema(p)) { | ||
| Schema inner = ModelUtils.getAdditionalProperties(p); | ||
| if (inner == null) { | ||
| inner = new StringSchema(); | ||
| } | ||
| return "Table[string, " + getTypeDeclaration(inner) + "]"; | ||
| } | ||
|
|
||
| String schemaType = getSchemaType(p); | ||
| if (typeMapping.containsKey(schemaType)) { | ||
| return typeMapping.get(schemaType); | ||
| } | ||
|
|
||
| if (schemaType.matches("\\d.*")) { // starts with number | ||
| return "`" + schemaType + "`"; | ||
| } else { | ||
| return schemaType; | ||
| } | ||
| } | ||
|
|
||
| @Override | ||
| public String toVarName(String name) { | ||
| if (isReservedWord(name)) { | ||
| name = escapeReservedWord(name); | ||
| } | ||
|
|
||
| if (name.matches("^\\d.*")) { | ||
| name = "`" + name + "`"; | ||
| } | ||
|
|
||
| return name; | ||
| } | ||
|
|
||
| @Override | ||
| public String toParamName(String name) { | ||
| return toVarName(name); | ||
| } | ||
|
|
||
| @Override | ||
| protected boolean needToImport(String type) { | ||
| if (defaultIncludes.contains(type)) { | ||
| return false; | ||
| } else if (languageSpecificPrimitives.contains(type)) { | ||
| return false; | ||
| } else if (typeMapping.containsKey(type) && languageSpecificPrimitives.contains(typeMapping.get(type))) { | ||
| return false; | ||
| } | ||
|
|
||
| return true; | ||
| } | ||
|
|
||
| @Override | ||
| public String toEnumName(CodegenProperty property) { | ||
| String name = StringUtils.camelize(property.name, false); | ||
|
|
||
| if (name.matches("\\d.*")) { // starts with number | ||
| return "`" + name + "`"; | ||
| } else { | ||
| return name; | ||
| } | ||
| } | ||
|
|
||
| @Override | ||
| public String toEnumVarName(String name, String datatype) { | ||
| name = name.replace(" ", "_"); | ||
| name = StringUtils.camelize(name, false); | ||
|
|
||
| if (name.matches("\\d.*")) { // starts with number | ||
| return "`" + name + "`"; | ||
| } else { | ||
| return name; | ||
| } | ||
| } | ||
| } | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We're using 4 space indention so I'll reformat the code in a separate PR. |
||
Uh oh!
There was an error while loading. Please reload this page.