{"record":{"id":"1c510268a493d317","repo":"BigPizzaV3/CodexPlusPlus","slug":"unsupported-dream-skin-image-format","errorCode":null,"errorMessage":"unsupported Dream Skin image format","messagePattern":"unsupported Dream Skin image format","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/codex-plus-core/src/dream_skin.rs","lineNumber":130,"sourceCode":"pub fn is_managed_dream_skin_image(path: &Path, state_dir: &Path) -> bool {\n    if !is_managed_image_name(path) || !path.is_file() {\n        return false;\n    }\n    let Ok(path) = std::fs::canonicalize(path) else {\n        return false;\n    };\n    let Ok(root) = std::fs::canonicalize(state_dir.join(MANAGED_THEME_DIR)) else {\n        return false;\n    };\n    path.parent().is_some_and(|parent| parent == root)\n}\n\nfn supported_image_extension(path: &Path) -> anyhow::Result<String> {\n    let extension = path\n        .extension()\n        .and_then(|value| value.to_str())\n        .map(str::to_ascii_lowercase)\n        .ok_or_else(|| anyhow::anyhow!(\"unsupported Dream Skin image format\"))?;\n    #[cfg(target_os = \"macos\")]\n    let supported = matches!(\n        extension.as_str(),\n        \"png\" | \"jpg\" | \"jpeg\" | \"heic\" | \"tif\" | \"tiff\" | \"webp\"\n    );\n    #[cfg(not(target_os = \"macos\"))]\n    let supported = matches!(\n        extension.as_str(),\n        \"png\" | \"jpg\" | \"jpeg\" | \"webp\" | \"gif\" | \"bmp\"\n    );\n    if !supported {\n        bail!(\"unsupported Dream Skin image format: {extension}\");\n    }\n    Ok(extension)\n}\n\n#[cfg(target_os = \"macos\")]\nfn prepare_image(","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/BigPizzaV3/CodexPlusPlus/blob/f2074595a281bc057525c748175c8eb9805b0673/crates/codex-plus-core/src/dream_skin.rs#L112-L148","documentation":"Thrown by supported_image_extension when the managed Dream Skin image path's extension (lowercased) matches none of the supported formats. The skin pipeline can only process the known image formats; the offending input is the extension of the image path passed by prepare_dream_skin_image_for_directory, and the guard fires before any image copying/conversion runs.","triggerScenarios":"Thrown at crates/codex-plus-core/src/dream_skin.rs:130 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["将图片转换为支持的格式（如 png）后重试","确认文件扩展名拼写正确且未被省略","在 UI 侧限制上传文件的类型","扩展 supported_image_extension 支持更多格式"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f2074595a281bc057525c748175c8eb9805b0673","analyzedAt":"2026-08-23T12:52:24.489Z","contentChangedAt":"2026-08-23T12:52:24.489Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}