{"record":{"id":"d65070e949d06968","repo":"usememos/memos","slug":"contains-expects-exactly-one-argument","errorCode":null,"errorMessage":"contains expects exactly one argument","messagePattern":"contains expects exactly one argument","errorType":"validation","errorClass":null,"httpStatus":400,"severity":"error","filePath":"internal/filter/parser.go","lineNumber":1006,"sourceCode":"\t\treturn nil, errors.Wrap(err, \"endsWith argument must be a constant string\")\n\t}\n\n\tsuffixStr, ok := suffix.(string)\n\tif !ok {\n\t\treturn nil, errors.New(\"endsWith argument must be a string\")\n\t}\n\n\treturn &EndsWithPredicate{Suffix: suffixStr}, nil\n}\n\n// buildContainsPredicate extracts the pattern from t.contains(\"substring\").\nfunc buildContainsPredicate(call *exprv1.Expr_Call, iterVar string) (PredicateExpr, error) {\n\tif target := call.Target.GetIdentExpr(); target == nil || target.GetName() != iterVar {\n\t\treturn nil, errors.Errorf(\"contains target must be the iteration variable %q\", iterVar)\n\t}\n\n\tif len(call.Args) != 1 {\n\t\treturn nil, errors.New(\"contains expects exactly one argument\")\n\t}\n\n\tsubstring, err := getConstValue(call.Args[0])\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"contains argument must be a constant string\")\n\t}\n\n\tsubstringStr, ok := substring.(string)\n\tif !ok {\n\t\treturn nil, errors.New(\"contains argument must be a string\")\n\t}\n\n\treturn &ContainsPredicate{Substring: substringStr}, nil\n}\n","sourceCodeStart":988,"sourceCodeEnd":1021,"githubUrl":"https://github.com/usememos/memos/blob/14d757ce1fb31c78590f374bc042f8dbedbc20d7/internal/filter/parser.go#L988-L1021","documentation":"buildContainsPredicate translates t.contains(\"substring\") and requires exactly one argument after validating the target is the iteration variable. Any other arity is rejected.","triggerScenarios":"Programmatically constructed contains call with wrong argument count; textual CEL always emits one argument, so this guard fires only on malformed ASTs.","commonSituations":"AST construction in tests; custom macro expansion emitting multi-arg contains.","solutions":["Use the textual form tag.exists(t, t.contains(\"work\"))","Emit exactly one argument when building the contains call node"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err := r.Render(cond); err != nil {\n    if strings.Contains(err.Error(), \"contains expects exactly one argument\") {\n        return errors.New(\"call contains with a single quoted substring\")\n    }\n    return err\n}","preventionTips":["Pass exactly one string argument to contains","Use textual method syntax t.contains(\"...\")"],"tags":["cel","filter","parser","comprehension","string-ops"],"backgroundTag":null,"analyzedSha":"14d757ce1fb31c78590f374bc042f8dbedbc20d7","analyzedAt":"2026-08-15T09:27:36.538Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}