{"record":{"id":"7c5e2e4b883aac15","repo":"flxzt/rnote","slug":"layout-try-from-u32-for-value-failed","errorCode":null,"errorMessage":"Layout try_from::<u32>() for value {} failed","messagePattern":"Layout try_from::<u32>\\(\\) for value (.+?) failed","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/rnote-engine/src/document/layout.rs","lineNumber":41,"sourceCode":"    ContinuousVertical,\n    #[serde(rename = \"semi_infinite\")]\n    SemiInfinite,\n    #[serde(rename = \"infinite\")]\n    Infinite,\n}\n\nimpl Default for Layout {\n    fn default() -> Self {\n        Self::Infinite\n    }\n}\n\nimpl TryFrom<u32> for Layout {\n    type Error = anyhow::Error;\n\n    fn try_from(value: u32) -> Result<Self, Self::Error> {\n        num_traits::FromPrimitive::from_u32(value)\n            .ok_or_else(|| anyhow::anyhow!(\"Layout try_from::<u32>() for value {} failed\", value))\n    }\n}\n\nimpl std::str::FromStr for Layout {\n    type Err = anyhow::Error;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            \"fixed-size\" => Ok(Self::FixedSize),\n            \"continuous-vertical\" => Ok(Self::ContinuousVertical),\n            \"semi-infinite\" => Ok(Self::SemiInfinite),\n            \"infinite\" => Ok(Self::Infinite),\n            s => Err(anyhow::anyhow!(\n                \"Layout from_string failed, invalid name: {s}\"\n            )),\n        }\n    }\n}","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/flxzt/rnote/blob/bbc5354502ba2fc83eec2670b535348825e679a6/crates/rnote-engine/src/document/layout.rs#L23-L59","documentation":"Layout implements TryFrom<u32> through num_traits::FromPrimitive; a u32 that maps to no Layout variant triggers this error. It validates numeric layout identifiers (fixed-size, continuous-vertical, semi-infinite, infinite) coming from stored data.","triggerScenarios":"Calling Layout::try_from(u32) with an invalid value, typically while deserializing layout preferences from a document or settings store.","commonSituations":"Files produced by a different rnote version with shifted enum discriminants, corrupted or manually edited files, and external integrations passing raw integers.","solutions":["Verify the u32 is a valid Layout discriminant before conversion.","Load the document with the rnote version that wrote it, or add a migration mapping old values.","Use the default Layout on failure instead of aborting the load.","Prefer name-based serialization (see Layout::from_str) over raw integers."],"exampleFix":"// before\nlet layout = Layout::try_from(raw_u32)?;\n// after\nlet layout = Layout::try_from(raw_u32)\n    .unwrap_or(Layout::default());","handlingStrategy":"validation","validationCode":"fn is_valid_layout(v: u32) -> bool {\n    Layout::try_from(v).is_ok()\n}","typeGuard":"fn as_layout(v: u32) -> Option<Layout> {\n    num_traits::FromPrimitive::from_u32(v)\n}","tryCatchPattern":"match Layout::try_from(raw) {\n    Ok(l) => l,\n    Err(_) => {\n        log::warn!(\"unknown layout {raw}; using default\");\n        Layout::default()\n    }\n}","preventionTips":["Validate layout integers before conversion","Migrate discriminants when variants change","Use the FromStr name-based path for human-facing config","Default gracefully instead of failing document load"],"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"}