{"record":{"id":"88aafd07f7396149","repo":"flxzt/rnote","slug":"measureunit-try-from-u32-for-value-failed","errorCode":null,"errorMessage":"MeasureUnit try_from::<u32>() for value {} failed","messagePattern":"MeasureUnit try_from::<u32>\\(\\) for value (.+?) failed","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/rnote-engine/src/document/format.rs","lineNumber":109,"sourceCode":"    Px = 0,\n    #[serde(rename = \"mm\")]\n    Mm,\n    #[serde(rename = \"cm\")]\n    Cm,\n}\n\nimpl Default for MeasureUnit {\n    fn default() -> Self {\n        Self::Px\n    }\n}\n\nimpl TryFrom<u32> for MeasureUnit {\n    type Error = anyhow::Error;\n\n    fn try_from(value: u32) -> Result<Self, Self::Error> {\n        num_traits::FromPrimitive::from_u32(value).ok_or_else(|| {\n            anyhow::anyhow!(\"MeasureUnit try_from::<u32>() for value {} failed\", value)\n        })\n    }\n}\n\nimpl MeasureUnit {\n    pub const AMOUNT_MM_IN_INCH: f64 = 25.4;\n\n    pub fn convert_measurement(\n        value: f64,\n        value_unit: MeasureUnit,\n        value_dpi: f64,\n        desired_unit: MeasureUnit,\n        desired_dpi: f64,\n    ) -> f64 {\n        let value_in_px = match value_unit {\n            MeasureUnit::Px => value,\n            MeasureUnit::Mm => (value / Self::AMOUNT_MM_IN_INCH) * value_dpi,\n            MeasureUnit::Cm => ((value * 10.0) / Self::AMOUNT_MM_IN_INCH) * value_dpi,","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/flxzt/rnote/blob/bbc5354502ba2fc83eec2670b535348825e679a6/crates/rnote-engine/src/document/format.rs#L91-L127","documentation":"MeasureUnit implements TryFrom<u32> via num_traits::FromPrimitive; any u32 without a matching MeasureUnit variant produces this error. It validates numeric unit identifiers restored from saved preferences or documents.","triggerScenarios":"Calling MeasureUnit::try_from(u32) with an out-of-range value, usually during deserialization of format preferences (e.g. units stored as integers in .rnote files).","commonSituations":"Documents written by other rnote versions where unit enum ordering changed, corrupted files, or code passing raw integers received from external sources.","solutions":["Check the u32 against the defined MeasureUnit variants before conversion.","Migrate enum values when loading files from older/newer rnote versions.","Fall back to a default MeasureUnit (e.g. px or mm) when conversion fails.","Serialize units by name rather than discriminant for forward compatibility."],"exampleFix":"// before\nlet unit = MeasureUnit::try_from(raw_u32)?;\n// after\nlet unit = MeasureUnit::try_from(raw_u32)\n    .unwrap_or(MeasureUnit::default());","handlingStrategy":"validation","validationCode":"fn is_valid_measure_unit(v: u32) -> bool {\n    MeasureUnit::try_from(v).is_ok()\n}","typeGuard":"fn as_measure_unit(v: u32) -> Option<MeasureUnit> {\n    num_traits::FromPrimitive::from_u32(v)\n}","tryCatchPattern":"match MeasureUnit::try_from(raw) {\n    Ok(u) => u,\n    Err(_) => {\n        log::warn!(\"unknown measure unit {raw}; defaulting\");\n        MeasureUnit::default()\n    }\n}","preventionTips":["Clamp or validate unit integers from external input","Add format migrations for old documents","Prefer name-based unit serialization","Test preference deserialization with documents from previous versions"],"tags":["rust","enum","deserialization"],"backgroundTag":"invalid-enum-value","analyzedSha":"bbc5354502ba2fc83eec2670b535348825e679a6","analyzedAt":"2026-09-08T13:20:33.747Z","contentChangedAt":"2026-09-08T13:20:33.747Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}