diff --git a/packages/functions-tools/src/converters/zod-to-rust.ts b/packages/functions-tools/src/converters/zod-to-rust.ts index f57f7215a..f553db419 100644 --- a/packages/functions-tools/src/converters/zod-to-rust.ts +++ b/packages/functions-tools/src/converters/zod-to-rust.ts @@ -103,7 +103,7 @@ const schemaToRustType = ({ const inner = schemaToRustType({schema: schema.inner, structName}); const fieldType = `Option<${inner.fieldType}>`; return inner.kind === 'composite' - ? composite({fieldType, structs: inner.structs}) + ? composite({fieldType, structs: inner.structs, needsJsonData: inner.needsJsonData}) : primitive({fieldType}); } diff --git a/packages/functions-tools/src/tests/converters/zod-to-rust.spec.ts b/packages/functions-tools/src/tests/converters/zod-to-rust.spec.ts index f30e22bc7..a5cb1a0ef 100644 --- a/packages/functions-tools/src/tests/converters/zod-to-rust.spec.ts +++ b/packages/functions-tools/src/tests/converters/zod-to-rust.spec.ts @@ -87,6 +87,15 @@ describe('object with enum field', () => { '#[derive(CandidType, Serialize, Deserialize, Clone, JsonData)]\npub struct MyFunctionArgs {\n pub status: MyFunctionArgsStatus,\n}' ].join('\n\n') ); + + rust( + 'myFunction', + z.object({role: z.enum(['admin', 'user']).optional()}), + [ + '#[derive(CandidType, Serialize, Deserialize, Clone)]\npub enum MyFunctionArgsRole {\n #[serde(rename = "admin")]\n Admin,\n #[serde(rename = "user")]\n User,\n}', + '#[derive(CandidType, Serialize, Deserialize, Clone, JsonData)]\npub struct MyFunctionArgs {\n pub role: Option,\n}' + ].join('\n\n') + ); }); // ─── Arrays ───────────────────────────────────────────────────────────────────