{"record":{"id":"1d730c5a99e20460","repo":"BoundaryML/baml","slug":"class-does-not-have-a-field","errorCode":null,"errorMessage":"Class {} does not have a field: {}","messagePattern":"Class (.+?) does not have a field: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/baml-lib/jsonish/src/helpers/mod.rs","lineNumber":80,"sourceCode":"        .enums(enums)\n        .classes(classes)\n        .recursive_classes(recursive_classes)\n        .structural_recursive_aliases(structural_recursive_aliases)\n        .build())\n}\n\nfn find_existing_class_field(\n    class_name: &str,\n    field_name: &str,\n    class_walker: &Result<ClassWalker<'_>>,\n    env_values: &EvaluationContext<'_>,\n) -> Result<(Name, TypeIR, Option<String>, bool)> {\n    let Ok(class_walker) = class_walker else {\n        anyhow::bail!(\"Class {} does not exist\", class_name);\n    };\n\n    let Some(field_walker) = class_walker.find_field(field_name) else {\n        anyhow::bail!(\"Class {} does not have a field: {}\", class_name, field_name);\n    };\n\n    let name = Name::new_with_alias(field_name.to_string(), field_walker.alias(env_values)?);\n    let desc = field_walker.description(env_values)?;\n    let r#type = field_walker.r#type();\n    let streaming_needed = field_walker.item.attributes.streaming_behavior().needed;\n    Ok((name, r#type.clone(), desc, streaming_needed))\n}\n\nfn find_enum_value(\n    enum_name: &str,\n    value_name: &str,\n    enum_walker: &Result<EnumWalker<'_>>,\n    env_values: &EvaluationContext<'_>,\n) -> Result<Option<(Name, Option<String>)>> {\n    if enum_walker.is_err() {\n        anyhow::bail!(\"Enum {} does not exist\", enum_name);\n    }","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/baml-lib/jsonish/src/helpers/mod.rs#L62-L98","documentation":"After the class resolves, find_existing_class_field looks up the field on the ClassWalker; if find_field returns None it bails with 'Class {} does not have a field: {}'. The referenced field name is absent from an otherwise valid class.","triggerScenarios":"A template/helper references class.field where the class exists but declares no field with that name (case-sensitive), e.g. accessing ctx or description helpers with a stale field name.","commonSituations":"Renamed or removed class fields while prompts/templates still use the old name; typos in field names; case sensitivity (e.g. 'userName' vs 'username'); dynamic field access built from strings that drifted from the schema.","solutions":["Correct the field name in the template/helper call to exactly match the class definition.","Check field case-sensitivity against the .baml class declaration.","Regenerate clients and search templates for the old field name after renames.","Consider adding an alias in the schema if the external name must differ."],"exampleFix":"// before\nclass UserInfo { userName string }\n{{ class_userinfo.username }}\n// after\n{{ class_userinfo.userName }}","handlingStrategy":"validation","validationCode":"// confirm the field exists before template use\nlet field_names: Vec<_> = class_walker.find_field_list().iter().map(|f| f.name()).collect();\nif !field_names.contains(&field_name.to_string()) {\n    return Err(anyhow::anyhow!(\"field '{}' not in class '{}'; available: {:?}\", field_name, class_name, field_names));\n}","typeGuard":"fn field_exists(w: &ClassWalker, name: &str) -> bool { w.find_field(name).is_some() }","tryCatchPattern":"match find_existing_class_field(class_name, field_name, &class_walker, &env) {\n    Ok(v) => use_field(v),\n    Err(err) => return Err(err.context(\"fix field name in template to match class definition\")),\n}","preventionTips":["Match field names exactly, including case","Search templates for old field names after schema renames","Use schema aliases when an external name must differ"],"tags":["rust","schema","field","template"],"backgroundTag":"schema-validation-failed","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}