java-apibuilder-generators-.../src/java-type.js

139 lines
3.8 KiB
JavaScript

const utils = require('./utils')
const COLLECTION_REGEX = /\[?([^\[\]]+)\]?/
const LAST_ELEMENT_REGEX = /(.*)\.([a-zA-Z_0-9]+$)/
const RESERVED_WORDS = [
'abstract', 'assert', 'boolean', 'break' , 'byte', 'case',
'catch', 'char', 'class', 'const', 'continue', 'default',
'double', 'do', 'else', 'enum', 'extends', 'false',
'final', 'finally', 'float', 'for','goto', 'if',
'implements', 'import', 'instanceof', 'int', 'interface', 'long',
'native', 'new', 'null', 'package', 'private', 'protected',
'public', 'return', 'short', 'static', 'strictfp', 'super',
'switch', 'synchronized', 'this', 'throw', 'throws', 'transient',
'true', 'try', 'void', 'volatile', 'while'
]
const SUPPORTED_TYPES = {
boolean: {
name: 'Boolean',
},
'date-iso8601': {
name: 'LocalDate',
imports: [ 'java.time.LocalDate', 'com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer', 'com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer' ],
serializer: 'LocalDateSerializer',
deserializer: 'LocalDateSerializer'
},
'date-time-iso8601': {
name: 'LocalDateTime',
imports: [ 'java.time.LocalDateTime', 'com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer', 'com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer' ],
serializer: 'LocalDateTimeSerializer',
deserializer: 'LocalDateTimeDeserializer'
},
decimal: {
name: 'BigDecimal',
imports: [ 'java.math.BigDecimal' ]
},
double: {
name: 'Double'
},
integer: {
name: 'Integer',
required_type: 'int'
},
long: {
name: 'Long',
},
object: {
name: 'Map<String, Object>',
imports: [ 'java.util.Map' ]
},
json: {
name: "Object"
},
string: {
name: 'String'
},
unit: {
name: 'Void'
},
uuid: {
name: 'UUID',
imports: [ 'java.util.UUID' ]
}
}
function getCustomType(type, namespace, suffix='') {
let match = LAST_ELEMENT_REGEX.exec(type)
let name = ''
let importstatement = null
if(match) {
name = utils.pascalcase(match[2])+suffix
importstatement = `${match[1].replace('enums', 'models')}.${name}`
}else {
name = utils.pascalcase(type)+suffix
importstatement = `${namespace}.models.${name}`
}
return {
name,
baseType: name,
fullQualifiedName: importstatement,
imports: [ importstatement ]
}
}
function mapCollection(type) {
let baseType = type.name
return {
name: `List<${baseType}>`,
baseType,
isEnum: type.isEnum,
fullQualifiedName: type.fullQualifiedName,
imports: [ ...(type.imports || []), 'java.util.List' ],
isCollection: true
}
}
module.exports = {
mapJavaType: (type, namespace, suffix='') => {
const baseType = COLLECTION_REGEX.exec(type)[1]
let javaType = SUPPORTED_TYPES[baseType] || getCustomType(baseType, namespace, suffix)
if(type.startsWith('[')) {
javaType = mapCollection(javaType);
}
javaType.imports = javaType.imports || []
return {
...javaType,
raw: type,
}
},
mapDefaultValue(type, value) {
if(!value) {
return value
}
if(type === 'string' || type.name === 'String') {
return `"${value}"`
}
if(value == '[]') {
return "List.of()"
}
if(type.isEnum) {
return `${type.name}.${value.toUpperCase()}`
}
return value
},
safeName(name) {
if(RESERVED_WORDS.includes(name)) {
return `${name}Value`;
}
return name;
}
}