{"record":{"id":"bd4df567007b5283","repo":"BoundaryML/baml","slug":"class-with-name-name-already-exists","errorCode":null,"errorMessage":"Class with name {name} already exists","messagePattern":"Class 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":74,"sourceCode":"\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))\n            }\n        }\n    }\n\n    pub fn class(&self, rt: &BamlRuntime, name: &str) -> anyhow::Result<ClassBuilder> {\n        match rt.ir.find_class(name) {\n            Ok(cls) => {\n                let _ = self.type_builder.upsert_class(name);\n                let builder = ClassBuilder::new(self.type_builder.clone(), name.to_string());\n                if !cls.item.attributes.dynamic() {\n                    Ok(builder.mode(NodeRW::ReadOnly))\n                } else {\n                    Ok(builder.mode(NodeRW::ReadWrite))","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/language_client_cffi/src/raw_ptr_wrapper/type_builder/objects.rs#L56-L92","documentation":"TypeBuilder::add_class refuses to create a class whose name is already defined in the runtime IR. Class names must be unique in BAML; attempting to add a duplicate bails with this error instead of silently overwriting the existing definition.","triggerScenarios":"Calling tb.add_class(rt, \"Name\") when a class named 'Name' already exists in the compiled BAML IR or was previously added via the same TypeBuilder.","commonSituations":"Dynamic class creation colliding with classes declared in .baml files; non-idempotent builder initialization re-run on each request; duplicated dynamic class registration.","solutions":["Use tb.class(rt, name) to retrieve and modify the existing class instead of add_class","Guard with an existence check before calling add_class","Rename the new class to a unique name"],"exampleFix":"// before\nlet cb = tb.add_class(rt, \"Resume\")?; // fails if Resume exists\n// after\nlet cb = match tb.class(rt, \"Resume\") {\n    Ok(cb) => cb,\n    Err(_) => tb.add_class(rt, \"Resume\")?,\n};","handlingStrategy":"try-catch","validationCode":"# caller side: check before add\nif class_exists(rt, \"Resume\"):\n    cb = tb.class(\"Resume\")\nelse:\n    cb = tb.add_class(rt, \"Resume\")","typeGuard":null,"tryCatchPattern":"try:\n    cb = tb.add_class(rt, name)\nexcept Exception as e:\n    if \"already exists\" in str(e):\n        cb = tb.class(name)\n    else:\n        raise","preventionTips":["Build dynamic classes idempotently: get-or-create pattern","Avoid re-running builder registration on every request; build once and reuse","Prefix dynamic class names to avoid clashing with .baml-declared classes"],"tags":["type-builder","duplicate","class","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"}