{"record":{"id":"865f73e79995a590","repo":"embassy-rs/embassy","slug":"could-not-parse-mul-div-enum-variant","errorCode":null,"errorMessage":"could not parse mul/div. enum={} variant={}","messagePattern":"could not parse mul/div\\. enum=(.+?) variant=(.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"embassy-stm32/build.rs","lineNumber":2429,"sourceCode":"                        };\n                        return Ok(f.simplify());\n                    }\n                }\n                if n.contains(\"Disabled\") {\n                    return Ok(Frac { num: 1, denom: 0 });\n                }\n                Err(())\n            }\n\n            if (kind == \"rcc\" && is_rcc_name(e.name)) || ((kind == \"adccommon\" || kind == \"adc\") && is_adc_name(e.name))\n            {\n                let kind = format_ident!(\"{}\", kind);\n                let enum_name = format_ident!(\"{}\", e.name);\n                let mut nums = Vec::new();\n                let mut denoms = Vec::new();\n                for v in e.variants {\n                    let Ok(val) = parse_num(v.name) else {\n                        panic!(\"could not parse mul/div. enum={} variant={}\", e.name, v.name)\n                    };\n                    let variant_name = format_ident!(\"{}\", v.name);\n                    let variant = quote!(crate::pac::#kind::vals::#enum_name::#variant_name);\n                    let num = val.num;\n                    let denom = val.denom;\n                    nums.push(quote!(#variant => #num,));\n                    denoms.push(quote!(#variant => #denom,));\n                }\n\n                g.extend(quote! {\n                    impl crate::time::Prescaler for crate::pac::#kind::vals::#enum_name {\n                        fn num(&self) -> u32 {\n                            match *self {\n                                #(#nums)*\n                                #[allow(unreachable_patterns)]\n                                _ => unreachable!(),\n                            }\n                        }","sourceCodeStart":2411,"sourceCodeEnd":2447,"githubUrl":"https://github.com/embassy-rs/embassy/blob/463a07b963419a1bfe61d5d597c44acb810afb8b/embassy-stm32/build.rs#L2411-L2447","documentation":"When generating RCC mul/div code, build.rs parses each clock enum variant name as a number (mul/div factor, e.g. DIV2, MUL4) with `parse_num`. If a variant name can't be interpreted as a number, the script panics naming the enum and variant. It means chip metadata contains a multiplier/divider enum variant outside the expected naming convention.","triggerScenarios":"Processing a clock enum whose variants aren't numeric-style names (e.g. an RCC PLL divider enum with symbolic variant names) while generating mul/div lookup tables.","commonSituations":"New STM32 families with unusual prescaler naming; metadata regenerated from different SVDs introducing nonstandard variant names.","solutions":["Check the named enum/variant in embassy-stm32's metadata and rename/normalize it to the expected numeric convention (e.g. DIV4, MUL8).","Extend build.rs's `parse_num` to handle the new naming pattern.","Regenerate metadata from the upstream source expected by this embassy-stm32 version."],"exampleFix":"// metadata enum variant \"DIV_2_POW_4\" -> unparsable\n// before: variant named DIV_2_POW_4\n// after: rename metadata variant to DIV16 so parse_num succeeds","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"// build-time only; extend parse_num to cover new naming\nfn parse_num(name: &str) -> Result<Num, ()> { /* handle DIVx/MULx and new forms */ }","preventionTips":["Keep prescaler/divider enum variant names in the standard DIVx/MULx convention.","Regenerate chip metadata only with tools matching your embassy-stm32 version.","Review new clock enums for non-numeric variant names before committing metadata."],"tags":["build-script","parsing","rcc","metadata"],"backgroundTag":"invalid-identifier-format","analyzedSha":"463a07b963419a1bfe61d5d597c44acb810afb8b","analyzedAt":"2026-09-10T13:38:26.660Z","contentChangedAt":"2026-09-10T13:38:26.660Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}