{"record":{"id":"fa4c928c74876d0a","repo":"BoundaryML/baml","slug":"enum-with-name-name-already-exists","errorCode":null,"errorMessage":"Enum with name {name} already exists","messagePattern":"Enum with name (.+?) already exists","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/language_client_cffi/src/raw_ptr_wrapper/type_builder/objects.rs","lineNumber":61,"sourceCode":"        assert!(NodeRW::LLMOnly.at_least(NodeRW::LLMOnly).is_ok());\n        assert!(NodeRW::LLMOnly.at_least(NodeRW::ReadWrite).is_err());\n\n        assert!(NodeRW::ReadWrite.at_least(NodeRW::ReadOnly).is_ok());\n        assert!(NodeRW::ReadWrite.at_least(NodeRW::LLMOnly).is_ok());\n        assert!(NodeRW::ReadWrite.at_least(NodeRW::ReadWrite).is_ok());\n    }\n}\n\n#[derive(Debug, Clone, Default)]\npub struct TypeBuilder {\n    pub type_builder: RuntimeTypeBuilder,\n}\n\nimpl TypeBuilder {\n    pub fn add_enum(&self, rt: &BamlRuntime, name: &str) -> anyhow::Result<EnumBuilder> {\n        match rt.ir.find_enum(name) {\n            Ok(_) => {\n                anyhow::bail!(\"Enum with name {name} already exists\");\n            }\n            Err(_) => {\n                let _ = self.type_builder.upsert_enum(name);\n                let builder = EnumBuilder::new(self.type_builder.clone(), name.to_string());\n                Ok(builder.mode(NodeRW::ReadWrite))\n            }\n        }\n    }\n\n    pub fn add_class(&self, rt: &BamlRuntime, name: &str) -> anyhow::Result<ClassBuilder> {\n        match rt.ir.find_class(name) {\n            Ok(_) => {\n                anyhow::bail!(\"Class with name {name} already exists\");\n            }\n            Err(_) => {\n                let _ = self.type_builder.upsert_class(name);\n                let builder = ClassBuilder::new(self.type_builder.clone(), name.to_string());\n                Ok(builder.mode(NodeRW::ReadWrite))","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/language_client_cffi/src/raw_ptr_wrapper/type_builder/objects.rs#L43-L79","documentation":"TypeBuilder::add_enum refuses to create an enum whose name is already defined in the runtime IR. BAML treats enum names as unique; adding a duplicate would create an ambiguous schema, so the call bails instead.","triggerScenarios":"Calling tb.add_enum(rt, \"Name\") when an enum named 'Name' already exists in the BAML source the runtime was compiled from, or when add_enum was already called for that name.","commonSituations":"Dynamically adding an enum that duplicates one declared in .baml files; re-running builder setup code without idempotency checks; name collisions between dynamic enums and statically-declared ones.","solutions":["Use tb.r#enum(rt, name) to fetch and modify the existing enum instead of add_enum","Check existence first (match rt.ir / wrap in a check) and only call add_enum for new names","Rename the new enum to avoid the collision"],"exampleFix":"// before\nlet eb = tb.add_enum(rt, \"Color\")?; // fails if Color exists\n// after\nlet eb = match tb.r#enum(rt, \"Color\") {\n    Ok(eb) => eb,\n    Err(_) => tb.add_enum(rt, \"Color\")?,\n};","handlingStrategy":"try-catch","validationCode":"# caller side: check before add\nif enum_exists(rt, \"Color\"):\n    eb = tb.enum(\"Color\")\nelse:\n    eb = tb.add_enum(rt, \"Color\")","typeGuard":null,"tryCatchPattern":"try:\n    eb = tb.add_enum(rt, name)\nexcept Exception as e:\n    if \"already exists\" in str(e):\n        eb = tb.enum(name)\n    else:\n        raise","preventionTips":["Make TypeBuilder setup idempotent: fetch-if-exists, add-if-missing","Keep dynamic enum names in one registry to detect collisions","Compare against enum names declared in .baml files before adding"],"tags":["type-builder","duplicate","enum","schema"],"backgroundTag":"file-already-exists","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}