Skip to content

Commit 6659519

Browse files
fix(proto): fix optional repeated field generation (#24)
- Fixed broken protobuf generation when using `optional` with `repeated` fields - Added `unwrap_or_default()` to handle missing values safely - Included missing `break` to prevent logic errors during parsing - Pushed final changeset for consistent behavior
1 parent c4f51cd commit 6659519

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@codama/renderers-vixen-parser": patch
3+
---
4+
5+
- Fix broken protobuf generation for optional vectors in IDL.

src/getProtoTypeManifestVisitor.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,9 @@ export function getProtoTypeManifestVisitor(options: {
304304

305305
const optionPrefix = resolveNestedTypeNode(optionType.prefix);
306306
if (optionPrefix.format === 'u8' && optionPrefix.endian === 'le') {
307+
if (childManifest.type.startsWith('repeated ')) {
308+
return childManifest;
309+
}
307310
return {
308311
...childManifest,
309312
type: `optional ${childManifest.type}`,

src/getRenderMapVisitor.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,14 +209,24 @@ function getOptionTypeTransform(
209209
const innerTransform = getTransform(item, outerTypeName, idlDefinedTypes, options);
210210
const cleanedTransform = innerTransform.replace(`self.${outerTypeName}`, 'x');
211211

212+
let returnTransform = '';
212213
switch (cleanedTransform) {
213214
case 'x':
214-
return `self.${outerTypeName}`;
215+
returnTransform = `self.${outerTypeName}`;
216+
break;
215217
case 'Some(x.into_proto())':
216-
return `self.${outerTypeName}.map(|x| x.into_proto())`;
218+
returnTransform = `self.${outerTypeName}.map(|x| x.into_proto())`;
219+
break;
217220
default:
218-
return `self.${outerTypeName}.map(|x| ${cleanedTransform})`;
221+
returnTransform = `self.${outerTypeName}.map(|x| ${cleanedTransform})`;
222+
break;
219223
}
224+
225+
if (item.kind === 'arrayTypeNode' || item.kind === 'fixedSizeTypeNode') {
226+
returnTransform += '.unwrap_or_default()';
227+
}
228+
229+
return returnTransform;
220230
}
221231

222232
function getTransform(

0 commit comments

Comments
 (0)