From c33234c831b116a6761953b4c0031d062ad4feb7 Mon Sep 17 00:00:00 2001 From: HaseenaSainul Date: Tue, 18 Jul 2023 09:02:07 -0400 Subject: [PATCH] Changes to avoid duplication of sub-array schema with same reference --- languages/c/Types.mjs | 2 ++ src/macrofier/engine.mjs | 25 ++++++++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/languages/c/Types.mjs b/languages/c/Types.mjs index 4c092a92..c4465bfe 100644 --- a/languages/c/Types.mjs +++ b/languages/c/Types.mjs @@ -304,6 +304,7 @@ function getSchemaTypeInfo(module = {}, json = {}, name = '', schemas = {}, pref } + name = name.endsWith("_ArrayType") ? name.split('_ArrayType')[0] : name prefix = prefix ? prefix + name : name let n = getTypeName(getModuleName(module), capitalize(res.name), prefix) structure.name = name ? name + capitalize(res.name) : res.name @@ -539,6 +540,7 @@ function getSchemaShapeInfo(json, module, schemas = {}, { name = '', prefix = '' } if (!isCPP) { + name = name.endsWith("_ArrayType") ? name.split('_ArrayType')[0] : name let subPrefix = prefix ? prefix + name : name let info = getSchemaTypeInfo(module, j, j.title || name, schemas, subPrefix, {level : level, descriptions: descriptions, title: true}) diff --git a/src/macrofier/engine.mjs b/src/macrofier/engine.mjs index 1ad8b6e6..610122ca 100644 --- a/src/macrofier/engine.mjs +++ b/src/macrofier/engine.mjs @@ -29,7 +29,7 @@ import isString from 'crocks/core/isString.js' import predicates from 'crocks/predicates/index.js' const { isObject, isArray, propEq, pathSatisfies, propSatisfies } = predicates -import { isRPCOnlyMethod, isProviderInterfaceMethod, getProviderInterface, getPayloadFromEvent, providerHasNoParameters, isTemporalSetMethod, hasMethodAttributes, getMethodAttributes, isEventMethodWithContext, getSemanticVersion, getSetterFor, getProvidedCapabilities, isPolymorphicPullMethod, hasPublicAPIs, createPolymorphicMethods } from '../shared/modules.mjs' +import { isRPCOnlyMethod, isProviderInterfaceMethod, getProviderInterface, getPayloadFromEvent, providerHasNoParameters, isTemporalSetMethod, isCallsMetricsMethod, isExcludedMethod, hasMethodAttributes, getMethodAttributes, isEventMethodWithContext, getSemanticVersion, getSetterFor, getProvidedCapabilities, isPolymorphicPullMethod, hasPublicAPIs, createPolymorphicMethods } from '../shared/modules.mjs' import isEmpty from 'crocks/core/isEmpty.js' import { getLinkedSchemaPaths, getSchemaConstraints, isSchema, localizeDependencies, isDefinitionReferencedBySchema } from '../shared/json-schema.mjs' @@ -356,9 +356,24 @@ const generateAggregateMacros = (openrpc, modules, templates, library) => Object }) const addContentDescriptorSubSchema = (descriptor, prefix, obj) => { - const title = prefix.charAt(0).toUpperCase() + prefix.substring(1) + descriptor.name.charAt(0).toUpperCase() + descriptor.name.substring(1) - if (obj.components.schemas[title]) { - throw 'Generated name `' + title + '` already exists...' + let title = '' + if (descriptor.schema.type === 'array' && descriptor.schema.items && descriptor.schema.items['$ref']) { + let refName = descriptor.schema.items['$ref'].split('/').pop() + title = refName.charAt(0).toUpperCase() + refName.substring(1) + '_ArrayType' + if (obj.components.schemas[title]) { + descriptor.schema = { + $ref: "#/components/schemas/" + title + } + return + } + } + else { + let descriptorName = capitalize(descriptor.name) + let prefixName = capitalize(prefix) + title = (prefixName !== descriptorName) ? prefixName + descriptorName : descriptorName + if (obj.components.schemas[title]) { + throw 'Generated name `' + title + '` already exists...' + } } obj.components.schemas[title] = descriptor.schema obj.components.schemas[title].title = title @@ -367,7 +382,7 @@ const addContentDescriptorSubSchema = (descriptor, prefix, obj) => { } } -// only consider sub-objects and sub enums to be sub-schemas +// only consider sub-objects, sub-array and sub-enums to be sub-schemas const isSubSchema = (schema) => schema.type === 'object' || (schema.type === 'string' && schema.enum) || (schema.type === 'array' && schema.items) const promoteAndNameSubSchemas = (obj) => {