{"record":{"id":"c49dd45144a9ac67","repo":"BoundaryML/baml","slug":"contains-an-e","errorCode":null,"errorMessage":"'{}' contains an {e}","messagePattern":"'(.+?)' contains an (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/bstd/src/project_fqn.rs","lineNumber":58,"sourceCode":"        }\n    }\n\n    pub fn parse(fqn: impl AsRef<str>) -> Result<Self> {\n        let fqn = fqn.as_ref();\n        let (org_slug, project_shortname) = fqn.split_once('/').context(format!(\n            \"'{fqn}' is not a valid fully-qualified project name - must specify both an org and project name\"\n        ))?;\n        let org_slug = org_slug.to_string();\n        let project_shortname = project_shortname.to_string();\n\n        let org_slug_regex = Regex::new(r\"^[a-z0-9_][a-z0-9_-]*$\")\n            .context(\"Failed to construct org name validator\")?;\n\n        if !org_slug_regex.is_match(&org_slug) {\n            anyhow::bail!(\"'{}' contains an invalid org name ('{}')\", fqn, org_slug);\n        }\n        Self::is_valid_project_shortname(&project_shortname)\n            .map_err(|e| anyhow::anyhow!(\"'{}' contains an {e}\", fqn))?;\n        Ok(Self {\n            org_slug,\n            project_shortname,\n        })\n    }\n}\n\nimpl Display for ProjectFqn {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"{}/{}\", self.org_slug, self.project_shortname)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use pretty_assertions::assert_eq;\n\n    use super::*;","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/bstd/src/project_fqn.rs#L40-L76","documentation":"After the org slug validates, ProjectFqn::parse validates the project shortname via is_valid_project_shortname and, on failure, wraps the inner error as \"'{fqn}' contains an {e}\". The inner error (e) describes the specific shortname rule violated (length, charset, etc.).","triggerScenarios":"Calling ProjectFqn::parse with an FQN whose project segment fails is_valid_project_shortname — e.g. invalid characters, wrong length, or empty shortname after the separator.","commonSituations":"Constructing FQNs from unvalidated user input or file paths; renames that leave trailing separators like \"org/\" producing an empty shortname.","solutions":["Read the wrapped inner error ({e}) to see which shortname rule failed and fix the shortname accordingly","Ensure the shortname is non-empty and uses allowed characters per is_valid_project_shortname","Trim separators/whitespace before parsing","Add pre-parse validation in the CLI to give users a friendly message"],"exampleFix":"// before\nlet fqn = ProjectFqn::parse(\"my-org/\")?; // empty shortname\n// after\nlet fqn = ProjectFqn::parse(\"my-org/my-project\")?;","handlingStrategy":"validation","validationCode":"fn valid_shortname(s: &str) -> bool { !s.is_empty() && s.len() <= 64 && s.chars().all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_') }","typeGuard":null,"tryCatchPattern":"match ProjectFqn::parse(input) { Ok(f) => f, Err(e) => { eprintln!(\"invalid FQN: {e}\"); return Ok(()); } }","preventionTips":["Validate project shortnames with the same rules as ProjectFqn before parsing","Reject empty shortnames (trailing separators) at input time","Reuse bstd's is_valid_project_shortname in UIs/CLIs for early feedback"],"tags":["validation","identifier","fqn"],"backgroundTag":"invalid-identifier-format","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}