{"record":{"id":"0b849f5b5227a66d","repo":"gleam-lang/gleam","slug":"failed-regex-to-match-valid-but-non-lowercase-name","errorCode":null,"errorMessage":"failed regex to match valid but non-lowercase name format","messagePattern":"failed regex to match valid but non-lowercase name format","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"compiler-cli/src/new.rs","lineNumber":369,"sourceCode":"            reason: InvalidProjectNameReason::ErlangStandardLibraryModule,\n        })\n    } else if parse::lexer::string_to_keyword(name).is_some() {\n        Err(Error::InvalidProjectName {\n            name: name.to_string(),\n            reason: InvalidProjectNameReason::GleamReservedWord,\n        })\n    } else if name == \"gleam\" {\n        Err(Error::InvalidProjectName {\n            name: name.to_string(),\n            reason: InvalidProjectNameReason::GleamReservedModule,\n        })\n    } else if regex::Regex::new(\"^[a-z][a-z0-9_]*$\")\n        .expect(\"failed regex to match valid name format\")\n        .is_match(name)\n    {\n        Ok(())\n    } else if regex::Regex::new(\"^[a-zA-Z][a-zA-Z0-9_]*$\")\n        .expect(\"failed regex to match valid but non-lowercase name format\")\n        .is_match(name)\n    {\n        Err(Error::InvalidProjectName {\n            name: name.to_string(),\n            reason: InvalidProjectNameReason::FormatNotLowercase,\n        })\n    } else {\n        Err(Error::InvalidProjectName {\n            name: name.to_string(),\n            reason: InvalidProjectNameReason::Format,\n        })\n    }\n}\n\nfn suggest_valid_name(invalid_name: &str, reason: &InvalidProjectNameReason) -> Option<String> {\n    match reason {\n        InvalidProjectNameReason::GleamPrefix => match invalid_name.strip_prefix(\"gleam_\") {\n            Some(stripped) if invalid_name != \"gleam_\" => {","sourceCodeStart":351,"sourceCodeEnd":387,"githubUrl":"https://github.com/gleam-lang/gleam/blob/15b07c783065c92bb016b1b74ed0995a5259850f/compiler-cli/src/new.rs#L351-L387","documentation":"Same pattern as the lowercase check: the mixed-case regex ^[a-zA-Z][a-zA-Z0-9_]*$ in validate_name is compiled with .expect(\"failed regex to match valid but non-lowercase name format\"). A panic here is an internal invariant violation, since the constant pattern is always valid. It exists to distinguish 'valid name but wrong case' from 'invalid format' when reporting InvalidProjectName.","triggerScenarios":"Called during validate_name (via suggest_valid_name or get_valid_project_name, e.g. `gleam new MyProject`) only if the regex engine fails to compile the fixed pattern — not caused by user input.","commonSituations":"Same as error 84: broken regex crate build, exotic target with insufficient stack, corrupted binary. Normally unreachable.","solutions":["Rebuild or update gleam to the latest version","Inspect/update the regex dependency if a regression is suspected","File a Gleam issue with platform and build details if reproducible"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"fn is_valid_but_not_lowercase(name: &str) -> bool {\n    let c0 = name.chars().next();\n    c0.map_or(false, |c| c.is_ascii_alphabetic())\n        && name.chars().all(|c| c.is_ascii_alphanumeric() || c == '_')\n        && name.chars().any(|c| c.is_ascii_uppercase())\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Prefer lowercase names to avoid the non-lowercase path entirely","Keep gleam builds reproducible and dependencies fresh","Report constant-regex panics upstream","Use the CLI suggestion when offered instead of crafting names"],"tags":["regex","panic","internal","project-name"],"backgroundTag":"invalid-regex-pattern","analyzedSha":"15b07c783065c92bb016b1b74ed0995a5259850f","analyzedAt":"2026-09-14T11:14:59.388Z","contentChangedAt":"2026-09-14T11:14:59.388Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}