{"record":{"id":"0e82244984da4888","repo":"flxzt/rnote","slug":"selectorstyle-try-from-u32-for-value-faile","errorCode":null,"errorMessage":"SelectorStyle try_from::<u32>() for value {} failed","messagePattern":"SelectorStyle try_from::<u32>\\(\\) for value (.+?) failed","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/rnote-engine/src/pens/pensconfig/selectorconfig.rs","lineNumber":40,"sourceCode":"    Rectangle,\n    #[serde(rename = \"single\", alias = \"apiece\")]\n    Single,\n    #[serde(rename = \"intersectingpath\")]\n    IntersectingPath,\n}\n\nimpl Default for SelectorStyle {\n    fn default() -> Self {\n        Self::Rectangle\n    }\n}\n\nimpl TryFrom<u32> for SelectorStyle {\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!(\"SelectorStyle try_from::<u32>() for value {} failed\", value)\n        })\n    }\n}\n\n#[derive(Clone, Debug, Serialize, Deserialize)]\n#[serde(default, rename = \"selector_config\")]\npub struct SelectorConfig {\n    #[serde(rename = \"style\")]\n    pub style: SelectorStyle,\n    #[serde(rename = \"resize_lock_aspectratio\")]\n    pub resize_lock_aspectratio: bool,\n}\n\nimpl Default for SelectorConfig {\n    fn default() -> Self {\n        Self {\n            style: SelectorStyle::default(),\n            resize_lock_aspectratio: false,","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/flxzt/rnote/blob/bbc5354502ba2fc83eec2670b535348825e679a6/crates/rnote-engine/src/pens/pensconfig/selectorconfig.rs#L22-L58","documentation":"SelectorStyle::try_from(u32) failed because no SelectorStyle variant (e.g. polygon) matches the given u32 via num_traits::FromPrimitive. The library throws this when a numeric selector-style value, usually restored from persisted settings, is not a valid variant discriminant.","triggerScenarios":"Calling `SelectorStyle::try_from(value)` with a u32 outside valid discriminants, e.g. a value from an old settings file after variants changed, or an out-of-range UI selector index.","commonSituations":"Restoring selector pen configuration across rnote versions; hand-edited config; a GUI dropdown index that no longer maps to a variant.","solutions":["Check that the u32 corresponds to a valid SelectorStyle discriminant (see selectorconfig.rs).","Fall back to SelectorStyle::default() when conversion fails on loaded settings.","Migrate or re-save settings produced by older app versions."],"exampleFix":"// before\nlet style = SelectorStyle::try_from(stored_u32)?;\n// after\nlet style = SelectorStyle::try_from(stored_u32)\n    .unwrap_or(SelectorStyle::default());","handlingStrategy":"fallback","validationCode":"fn is_valid_selector_style(v: u32) -> bool {\n    SelectorStyle::try_from(v).is_ok()\n}","typeGuard":"fn as_selector_style(v: u32) -> Option<SelectorStyle> {\n    num_traits::FromPrimitive::from_u32(v)\n}","tryCatchPattern":"let style = SelectorStyle::try_from(raw)\n    .map_err(|e| log::warn!(\"{e}; using default\"))\n    .unwrap_or(SelectorStyle::default());","preventionTips":["Clamp or validate UI dropdown indices against the enum variant count before conversion.","Migrate persisted selector settings when the enum layout changes.","Prefer name-based enum serialization over raw discriminants."],"tags":["rust","enum-conversion","configuration"],"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-16T04:17:20.429Z"}