{"record":{"id":"6033133d5896c13f","repo":"flxzt/rnote","slug":"layout-from-string-failed-invalid-name-s","errorCode":null,"errorMessage":"Layout from_string failed, invalid name: {s}","messagePattern":"Layout from_string failed, invalid name: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/rnote-engine/src/document/layout.rs","lineNumber":54,"sourceCode":"impl 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}\n\nimpl Display for Layout {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        match self {\n            Layout::FixedSize => write!(f, \"fixed-size\"),\n            Layout::ContinuousVertical => write!(f, \"continuous-vertical\"),\n            Layout::SemiInfinite => write!(f, \"semi-infinite\"),\n            Layout::Infinite => write!(f, \"infinite\"),\n        }\n    }\n}\n\nimpl Layout {","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/flxzt/rnote/blob/bbc5354502ba2fc83eec2670b535348825e679a6/crates/rnote-engine/src/document/layout.rs#L36-L72","documentation":"Layout's FromStr parses layout names like \"fixed-size\", \"continuous-vertical\", \"semi-infinite\", and \"infinite\"; any other string produces this error naming the invalid input. It is the string-based counterpart to the numeric TryFrom conversion.","triggerScenarios":"Calling \"fixed-size\".parse::<Layout>() or Layout::from_str with a misspelled, differently-cased, or unknown layout name string.","commonSituations":"Typo'd layout names in config files or CLI arguments, strings persisted by older versions with renamed variants, and user-supplied input not validated before parsing.","solutions":["Use one of the exact accepted names: fixed-size, continuous-vertical, semi-infinite, infinite.","Normalize input (trim, lowercase) before parsing.","Validate/autocomplete the layout name against the known variants in UI or CLI code.","Fall back to the default Layout when parsing fails."],"exampleFix":"// before\nlet layout: Layout = user_input.parse()?;\n// after\nlet layout: Layout = user_input.trim().to_lowercase().parse()\n    .unwrap_or(Layout::default());","handlingStrategy":"validation","validationCode":"const LAYOUT_NAMES: [&str; 4] = [\"fixed-size\", \"continuous-vertical\", \"semi-infinite\", \"infinite\"];\nfn is_valid_layout_name(s: &str) -> bool {\n    LAYOUT_NAMES.contains(&s)\n}","typeGuard":"fn parse_layout(s: &str) -> Option<Layout> {\n    s.parse::<Layout>().ok()\n}","tryCatchPattern":"match user_input.parse::<Layout>() {\n    Ok(l) => l,\n    Err(e) => {\n        eprintln!(\"invalid layout name: {e}\");\n        Layout::default()\n    }\n}","preventionTips":["Accept only the exact variant names; normalize case/whitespace first","Validate layout names in config/CLI before parsing","Keep the accepted name list in sync with the enum","Provide a default fallback for unknown names"],"tags":["rust","enum","parsing"],"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"}