diff --git a/.changeset/fix-optional-repeated-protobuf.md b/.changeset/fix-optional-repeated-protobuf.md new file mode 100644 index 0000000..f04ca74 --- /dev/null +++ b/.changeset/fix-optional-repeated-protobuf.md @@ -0,0 +1,5 @@ +--- +"@codama/renderers-vixen-parser": patch +--- + +- Fix broken protobuf generation for optional vectors in IDL. \ No newline at end of file diff --git a/src/getProtoTypeManifestVisitor.ts b/src/getProtoTypeManifestVisitor.ts index bb0cadc..154f78a 100644 --- a/src/getProtoTypeManifestVisitor.ts +++ b/src/getProtoTypeManifestVisitor.ts @@ -304,6 +304,9 @@ export function getProtoTypeManifestVisitor(options: { const optionPrefix = resolveNestedTypeNode(optionType.prefix); if (optionPrefix.format === 'u8' && optionPrefix.endian === 'le') { + if (childManifest.type.startsWith('repeated ')) { + return childManifest; + } return { ...childManifest, type: `optional ${childManifest.type}`, diff --git a/src/getRenderMapVisitor.ts b/src/getRenderMapVisitor.ts index c2d35cc..00e5efb 100644 --- a/src/getRenderMapVisitor.ts +++ b/src/getRenderMapVisitor.ts @@ -207,14 +207,24 @@ function getOptionTypeTransform( const innerTransform = getTransform(item, outerTypeName, idlDefinedTypes, options); const cleanedTransform = innerTransform.replace(`self.${outerTypeName}`, 'x'); + let returnTransform = ''; switch (cleanedTransform) { case 'x': - return `self.${outerTypeName}`; + returnTransform = `self.${outerTypeName}`; + break; case 'Some(x.into_proto())': - return `self.${outerTypeName}.map(|x| x.into_proto())`; + returnTransform = `self.${outerTypeName}.map(|x| x.into_proto())`; + break; default: - return `self.${outerTypeName}.map(|x| ${cleanedTransform})`; + returnTransform = `self.${outerTypeName}.map(|x| ${cleanedTransform})`; + break; } + + if (item.kind === 'arrayTypeNode' || item.kind === 'fixedSizeTypeNode') { + returnTransform += '.unwrap_or_default()'; + } + + return returnTransform; } function getTransform(