Skip to content

Commit

Permalink
feat: Add support for enum key name prefix
Browse files Browse the repository at this point in the history
  • Loading branch information
alkalinecoffee committed Jun 3, 2024
1 parent b0fb2f0 commit 17b7a31
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 31 deletions.
9 changes: 2 additions & 7 deletions languages/c/src/types/NativeHelpers.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ const getNativeType = (json, fireboltString = false) => {
}
else if (jsonType === 'null' ) {
type = 'void'
}
}
return type
}

Expand Down Expand Up @@ -125,18 +125,13 @@ const getArrayAccessors = (arrayName, propertyType, valueType) => {
return res
}

const enumValue = (val,prefix) => {
const keyName = getSafeEnumKeyName(val)
return ` ${prefix.toUpperCase()}_${keyName.toUpperCase()}`
}

const generateEnum = (schema, prefix)=> {
if (!schema.enum) {
return ''
}
else {
let str = `typedef enum {\n`
str += schema.enum.map(e => enumValue(e, prefix)).join(',\n')
str += schema.enum.map(e => getSafeEnumKeyName(val, prefix)).join(',\n')
str += `\n} ${prefix};\n`
return str
}
Expand Down
8 changes: 4 additions & 4 deletions src/macrofier/types.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -226,8 +226,8 @@ const insertEnumMacros = (content, schema, module, name, suffix, templateDir = "
schema.enum.map(value => {
if (!value) {
value = getTemplate(path.join(templateDir, 'unset' + suffix))
}
value ? values.push(template[i].replace(/\$\{key\}/g, getSafeEnumKeyName(value))
}
value ? values.push(template[i].replace(/\$\{key\}/g, getSafeEnumKeyName(value, schema.enumKeyPrefix))
.replace(/\$\{value\}/g, value)) : ''
})
template[i] = values.map((value, id) => {
Expand Down Expand Up @@ -543,7 +543,7 @@ function getSchemaShape(schema = {}, module = {}, { templateDir = 'types', paren
const suffix = destination && ('.' + destination.split('.').pop()) || ''
const theTitle = insertSchemaMacros(getTemplate(path.join(templateDir, 'title' + suffix)), schema, module, { name: schema.title, parent, property, required, recursive: false })

let result = getTemplate(path.join(templateDir, 'default' + suffix)) || '${shape}'
let result = getTemplate(path.join(templateDir, 'default' + suffix)) || '${shape}'

let genericTemplate = getTemplate(path.join(templateDir, 'generic' + suffix))
if (enums && level === 0 && Array.isArray(schema.enum) && ((schema.type === "string") || (schema.type[0] === "string"))) {
Expand Down Expand Up @@ -852,7 +852,7 @@ function getSchemaType(schema, module, { destination, templateDir = 'types', lin
const shape = insertAnyOfMacros(getTemplate(path.join(templateDir, 'anyOf' + suffix)), schema, module, theTitle)
return insertSchemaMacros(shape, schema, module, { name: theTitle, recursive: false })


// if (event) {
// return getSchemaType((schema.oneOf || schema.anyOf)[0], module, { destination, link, title, code, asPath, baseUrl })
// }
Expand Down
41 changes: 24 additions & 17 deletions src/shared/json-schema.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ const objectPaths = obj => {
return isObject(value) ?
product.concat(paths(value, fullPath))
: product.concat(fullPath)
}, []) : []
}, []) : []
}
return paths(obj);
}
Expand Down Expand Up @@ -100,7 +100,7 @@ const replaceUri = (existing, replacement, schema) => {
Object.keys(schema).forEach(key => {
replaceUri(existing, replacement, schema[key])
})
}
}
}

const replaceRef = (existing, replacement, schema) => {
Expand Down Expand Up @@ -176,7 +176,7 @@ function getSchemaConstraints(schema, module, options = { delimiter: '\n' }) {
typeof schema.exclusiveMinimum === 'number' ? constraints.push(`exclusiveMinimum: ${schema.exclusiveMinimum}`) : null
typeof schema.multipleOf === 'number' ? constraints.push(`multipleOf: ${schema.multipleOf}`) : null

return constraints.join(options.delimiter)
return constraints.join(options.delimiter)
}
else if (schema.type === 'array' && schema.items) {
let constraints = []
Expand All @@ -188,7 +188,7 @@ function getSchemaConstraints(schema, module, options = { delimiter: '\n' }) {
constraints = [getSchemaConstraints(schema.items, module, options)]
}

return constraints.join(options.delimiter)
return constraints.join(options.delimiter)
}
else if (schema.oneOf || schema.anyOf) {
return '' //See OpenRPC Schema for `oneOf` and `anyOf` details'
Expand Down Expand Up @@ -228,7 +228,7 @@ const localizeDependencies = (json, document, schemas = {}, options = defaultLoc
if (!options.externalOnly) {
while (refs.length > 0) {
for (let i=0; i<refs.length; i++) {
let path = refs[i]
let path = refs[i]
const ref = getPathOr(null, path, definition)
path.pop() // drop ref
if (refToPath(ref).length > 1) {
Expand All @@ -241,7 +241,7 @@ const localizeDependencies = (json, document, schemas = {}, options = defaultLoc
resolvedSchema = { "$REF": ref}
unresolvedRefs.push([...path])
}

if (path.length) {
// don't loose examples from original object w/ $ref
// todo: should we preserve other things, like title?
Expand All @@ -252,22 +252,22 @@ const localizeDependencies = (json, document, schemas = {}, options = defaultLoc
else {
delete definition['$ref']
Object.assign(definition, resolvedSchema)
}
}
}
}
refs = getLocalSchemaPaths(definition)
}
}

refs = getExternalSchemaPaths(definition)
while (refs.length > 0) {
for (let i=0; i<refs.length; i++) {
let path = refs[i]
let path = refs[i]
const ref = getPathOr(null, path, definition)

path.pop() // drop ref
let resolvedSchema

if (!resolvedSchema) {
resolvedSchema = { "$REF": ref}
unresolvedRefs.push([...path])
Expand Down Expand Up @@ -426,12 +426,19 @@ function mergeOneOf(schema) {
return union(schema.oneOf)
}

const getSafeEnumKeyName = (value) => value.split(':').pop() // use last portion of urn:style:values
.replace(/[\.\-]/g, '_') // replace dots and dashes
.replace(/\+/g, '_plus') // change + to _plus
.replace(/([a-z])([A-Z0-9])/g, '$1_$2') // camel -> snake case
.replace(/^([0-9]+(\.[0-9]+)?)/, 'v$1') // insert `v` in front of things that look like version numbers
.toUpperCase()
const getSafeEnumKeyName = function(value, keyPrefix = '') {
if (keyPrefix != '') {
value = keyPrefix + '_' + value
}

let key = value.split(':').pop() // use last portion of urn:style:values
.replace(/\+/g, '_plus') // change + to _plus
.replace(/[\.\-\/\;]/g, '_') // replace special characters
.replace(/([a-z])([A-Z0-9])/g, '$1_$2') // camel -> snake case
.replace(/^([0-9]+\_([0-9]+)?)/, 'v$1') // insert `v` in front of things that look like version numbers

return key.toUpperCase()
}

export {
getSchemaConstraints,
Expand All @@ -450,4 +457,4 @@ export {
removeIgnoredAdditionalItems,
mergeAnyOf,
mergeOneOf
}
}
6 changes: 3 additions & 3 deletions src/validate/index.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ const run = async ({

addFormats(ajv)
// explicitly add our custom extensions so we can keep strict mode on (TODO: put these in a JSON config?)
ajv.addVocabulary(['x-method', 'x-this-param', 'x-additional-params', 'x-schemas', 'components', 'x-property'])
ajv.addVocabulary(['x-method', 'x-this-param', 'x-additional-params', 'x-schemas', 'components', 'x-property', 'enumKeyPrefix'])

const firebolt = ajv.compile(fireboltOpenRpcSpec)
const jsonschema = ajv.compile(jsonSchemaSpec)
Expand Down Expand Up @@ -151,7 +151,7 @@ const run = async ({
}
})

const examples = ajv.compile(exampleSpec)
const examples = ajv.compile(exampleSpec)

let result = validate(json, {}, ajv, jsonschema)
let exampleResult = validate(json, {}, ajv, examples)
Expand Down Expand Up @@ -301,4 +301,4 @@ const run = async ({
return Promise.resolve()
}

export default run
export default run

0 comments on commit 17b7a31

Please sign in to comment.