{"record":{"id":"15c3fbbc64f7028c","repo":"BoundaryML/baml","slug":"enum-with-name-name-already-exists-type-builder","errorCode":null,"errorMessage":"Enum with name {name} already exists.","messagePattern":"Enum with name (.+?) already exists\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"engine/language_client_python/python_src/baml_py/type_builder.py","lineNumber":98,"sourceCode":"        return self._tb.bool()\n\n    def list(self, inner: FieldType):\n        return self._tb.list(inner)\n\n    def null(self):\n        return self._tb.null()\n\n    def map(self, key: FieldType, value: FieldType):\n        return self._tb.map(key, value)\n\n    def union(self, types: typing.List[FieldType]):\n        return self._tb.union(*types)\n\n    def add_class(self, name: str) -> \"NewClassBuilder\":\n        if name in self.__classes:\n            raise ValueError(f\"Class with name {name} already exists.\")\n        if name in self.__enums:\n            raise ValueError(f\"Enum with name {name} already exists.\")\n        self.__classes.add(name)\n        return NewClassBuilder(self._tb, name)\n\n    def add_enum(self, name: str) -> \"NewEnumBuilder\":\n        if name in self.__classes:\n            raise ValueError(f\"Class with name {name} already exists.\")\n        if name in self.__enums:\n            raise ValueError(f\"Enum with name {name} already exists.\")\n        self.__enums.add(name)\n        return NewEnumBuilder(self._tb, name)\n\n    def add_baml(self, baml: str):\n        return self._tb.add_baml(baml, self.__runtime)\n\n\nclass NewClassBuilder:\n    def __init__(self, tb: _TypeBuilder, name: str):\n        self.__bldr = tb.class_(name)","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/language_client_python/python_src/baml_py/type_builder.py#L80-L116","documentation":"TypeBuilder.add_class() also raises ValueError when the requested class name collides with an enum previously registered via add_enum() in the same builder. Class and enum names share one namespace in BAML dynamic types, so a class cannot shadow an existing enum name.","triggerScenarios":"Calling tb.add_enum(\"Status\") followed by tb.add_class(\"Status\") (or the reverse order) on the same TypeBuilder instance.","commonSituations":"Generating dynamic types from a schema where a class and an enum happen to share a name; merging type definitions from two modules into one builder; copy-pasted setup code adding both with the same identifier.","solutions":["Rename one of the conflicting types (e.g. Status -> StatusEnum or StatusClass).","Track registered names in one set in your code and check before either add_enum or add_class.","Split type definitions across separate TypeBuilder instances if the namespace collision is intentional in different contexts.","Fix the schema/source generator that emits colliding names."],"exampleFix":"# before\ntb.add_enum(\"Status\")\ntb.add_class(\"Status\")  # ValueError: Class with name Status already exists (enum namespace)\n\n# after\ntb.add_enum(\"Status\")\ntb.add_class(\"StatusRecord\")  # unique names","handlingStrategy":"validation","validationCode":"used_names = set()\ndef register(tb, kind, name):\n    if name in used_names:\n        raise ValueError(f\"{name} already registered\")\n    (tb.add_class if kind == \"class\" else tb.add_enum)(name)\n    used_names.add(name)","typeGuard":"def name_is_free(tb, name: str) -> bool:\n    classes = getattr(tb, \"_TypeBuilder__classes\", set())\n    enums = getattr(tb, \"_TypeBuilder__enums\", set())\n    return name not in classes and name not in enums","tryCatchPattern":"try:\n    tb.add_class(name)\nexcept ValueError as e:\n    if \"already exists\" in str(e):\n        tb.add_class(f\"{name}Record\")  # rename on collision\n    else:\n        raise","preventionTips":["Remember classes and enums share one namespace in a TypeBuilder","Validate schema-derived names for collisions before registering","Register every type through one helper that owns a used-names set","Suffix generated names (e.g. Enum/Record) to avoid natural collisions"],"tags":["python","type-builder","duplicate-name","namespace-collision"],"backgroundTag":"duplicate-definition","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"}