{"record":{"id":"bf2170d905b523bb","repo":"sigoden/aichat","slug":"invalid-path-path-str","errorCode":null,"errorMessage":"Invalid path '{path_str}'","messagePattern":"Invalid path '(.+?)'","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/utils/path.rs","lineNumber":135,"sourceCode":"                .unwrap_or_default()\n            {\n                \"/\"\n            } else {\n                \".\"\n            }\n            .into();\n        }\n\n        let extensions = if let Some(curly_brace_end) = path_str[start..].find('}') {\n            let end = start + curly_brace_end;\n            let extensions_str = &path_str[start + offset..end + 1];\n            if extensions_str.starts_with('{') && extensions_str.ends_with('}') {\n                extensions_str[1..extensions_str.len() - 1]\n                    .split(',')\n                    .map(|s| s.to_string())\n                    .collect::<Vec<String>>()\n            } else {\n                bail!(\"Invalid path '{path_str}'\");\n            }\n        } else {\n            let extensions_str = &path_str[start + offset..];\n            vec![extensions_str.to_string()]\n        };\n        let extensions = if extensions.is_empty() {\n            None\n        } else {\n            Some(extensions)\n        };\n        Ok((base_path, extensions, current_only))\n    } else if path_str.ends_with(\"/**\") || path_str.ends_with(r\"\\**\") {\n        Ok((path_str[0..path_str.len() - 3].to_string(), None, false))\n    } else {\n        Ok((path_str.to_string(), None, false))\n    }\n}\n","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/sigoden/aichat/blob/82976d349ad97ac9aae0655ad631dace5e2a6385/src/utils/path.rs#L117-L153","documentation":"parse_glob parses path patterns like 'dir/**/*.{rs,toml}'. When it finds a brace-like segment it cannot interpret as a '{ext,ext}' extension list, it bails with 'Invalid path'. Only comma-separated extensions inside braces are supported.","triggerScenarios":"Calling path expansion (e.g. via config file patterns or expand_glob_paths) with a malformed extension group such as '{}', '{rs}', '{rs,}', nested braces, or braces used for something other than extensions.","commonSituations":"Typos in config glob patterns; copy-pasting shell brace expansion that the parser doesn't support; empty braces intending 'all files'.","solutions":["Use only comma-separated extensions inside braces: '*.{rs,toml}'","Remove empty or single-item braces; use '*.rs' or '*' instead of '{}'","Avoid spaces and nested braces inside the extension list","Test the pattern with a simple glob like 'src/**/*.rs' first"],"exampleFix":"// before (invalid)\ninclude = [\"src/**/*{}\", \"docs/{md}']\n// after\ninclude = [\"src/**/*.rs\", \"docs/*.md\"]","handlingStrategy":"validation","validationCode":"const INVALID_EXT_BRACE = /\\{\\}|\\{[^,}]*\\}/;\nfunction validGlob(p) {\n  const braces = p.match(/\\{[^}]*\\}/g) || [];\n  return braces.every(b => /^\\{[\\w]+(,[\\w]+)*\\}$/.test(b));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Only use {a,b,c} brace groups with comma-separated extensions","Never use empty braces; use '*' for all files","Lint config glob patterns in CI"],"tags":["glob","path","parsing","config"],"backgroundTag":"invalid-argument-format","analyzedSha":"82976d349ad97ac9aae0655ad631dace5e2a6385","analyzedAt":"2026-09-09T18:33:06.139Z","contentChangedAt":"2026-09-09T18:33:06.139Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}