{"record":{"id":"eca5224597ae20ad","repo":"BoundaryML/baml","slug":"replace-method-takes-exactly-2-arguments-at","errorCode":null,"errorMessage":"replace() method takes exactly 2 arguments at {:?}","messagePattern":"replace\\(\\) method takes exactly 2 arguments at (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/baml-compiler/src/thir/interpret.rs","lineNumber":2977,"sourceCode":"            };\n            let BamlValueWithMeta::Int(end, _) = &args[1] else {\n                bail!(\"substring() end argument must be an int at {:?}\", meta.0);\n            };\n\n            let start = (*start as usize).min(s.len());\n            let end = (*end as usize).min(s.len()).max(start);\n\n            Ok(BamlValueWithMeta::String(\n                s[start..end].to_string(),\n                meta.clone(),\n            ))\n        }\n        \"replace\" => {\n            let BamlValueWithMeta::String(s, _) = receiver else {\n                bail!(\"replace() method only available on strings at {:?}\", meta.0);\n            };\n            if args.len() != 2 {\n                bail!(\"replace() method takes exactly 2 arguments at {:?}\", meta.0);\n            }\n            let BamlValueWithMeta::String(search, _) = &args[0] else {\n                bail!(\"replace() search argument must be a string at {:?}\", meta.0);\n            };\n            let BamlValueWithMeta::String(replacement, _) = &args[1] else {\n                bail!(\n                    \"replace() replacement argument must be a string at {:?}\",\n                    meta.0\n                );\n            };\n            // Replace first occurrence only (matching JavaScript behavior)\n            let result = s.replacen(search.as_str(), replacement.as_str(), 1);\n            Ok(BamlValueWithMeta::String(result, meta.clone()))\n        }\n        \"to_fixed\" => {\n            let value = match receiver {\n                BamlValueWithMeta::Float(v, _) => *v,\n                BamlValueWithMeta::Int(v, _) => *v as f64,","sourceCodeStart":2959,"sourceCodeEnd":2995,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/baml-compiler/src/thir/interpret.rs#L2959-L2995","documentation":"The \"replace\" string method requires exactly 2 arguments (search, replacement). The interpreter bails when args.len() != 2, reporting the source span. The arity check happens after the receiver type check, so the receiver was a valid string.","triggerScenarios":"Calling str.replace() with 0, 1, 3+ arguments, e.g. replace(\"a\") (missing replacement) or replace(\"a\",\"b\",\"c\") (extra argument).","commonSituations":"Porting code from languages where replace/replaceAll takes a regex-only single argument (e.g. JS str.replace(regex) with implicit empty replacement semantics), or hand-editing expressions and forgetting the second argument.","solutions":["Supply exactly two arguments: search string and replacement string","If only one argument was intended, pass an empty string \"\" as the replacement or use a different method","If you wanted to replace a literal with nothing, write replace(\"x\", \"\")"],"exampleFix":"// before\nlet out = s.replace(\"BAD\");\n// after\nlet out = s.replace(\"BAD\", \"\");","handlingStrategy":"validation","validationCode":"// replace requires exactly 2 string args: s.replace(search, replacement)","typeGuard":null,"tryCatchPattern":"try { out = s.replace(a, b); } catch (e) { log(\"replace arity error: \" + e); }","preventionTips":["Always pass both search and replacement","To delete a substring, pass \"\" as the replacement","Remember this replaces only the first occurrence"],"tags":["runtime","arity","strings","baml"],"backgroundTag":"missing-required-argument","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"}