larksuite/cli · error
default: %w
Error message
default: %w
What it means
validateInputCLI rejects a shortcut input field whose declared default value is not assignable to the field's Go value type. When a field declares a default (defaultValue.Set), valueAssignableTo checks the default against field.valueType; any mismatch (wrong kind, wrong scalar type, invalid JSON for complex types) is wrapped as "default: <underlying reason>" so the root cause is preserved. This is a registration-time schema validation error, thrown before any CLI parsing happens.
Source
Thrown at shortcuts/common/typed_compile_args.go:278
if supplement.CLI.Deprecated != "" {
if field.cli.Deprecated != "" {
return fmt.Errorf("CLI.Deprecated is declared twice")
}
field.cli.Deprecated = supplement.CLI.Deprecated
}
return nil
}
func validateInputCLI(field *compiledInputField) error {
if field.cli.Deprecated != "" && !field.cli.Hidden {
return fmt.Errorf("deprecated primary flag must be hidden")
}
if field.required && field.defaultValue.Set {
return fmt.Errorf("required input cannot declare a default")
}
if field.defaultValue.Set {
if err := valueAssignableTo(field.defaultValue.Value, field.valueType); err != nil {
return fmt.Errorf("default: %w", err)
}
}
seenSources := make(map[typedValueSource]struct{})
for _, source := range field.cli.ValueSources {
if source != typedSourceFlag && source != typedSourceFile && source != typedSourceStdin {
return fmt.Errorf("unknown value source %q", source)
}
if _, duplicate := seenSources[source]; duplicate {
return fmt.Errorf("duplicate value source %q", source)
}
seenSources[source] = struct{}{}
}
if len(field.cli.ValueSources) > 0 {
if _, ok := seenSources[typedSourceFlag]; !ok {
return fmt.Errorf("ValueSources must include flag")
}
if (len(seenSources) > 1) && indirectKind(field.valueType) != reflect.String && field.cli.Encoding != typedEncodingJSON {
return fmt.Errorf("file/stdin sources require string input or encoding=json")View on GitHub (pinned to 7fd6ef3c07)
Solutions
- Change the default value's Go type so it matches field.valueType (e.g. use 8080 for an int field, "8080" for a string field)
- If the default is intentional for a differently-typed field, convert it explicitly (strconv.Itoa/ParseInt) at declaration time
- Remove the default if the field must always be supplied explicitly
Example fix
// before Value: 42 // default on a field of type string // after Value: "42" // matches the field's string type
Defensive patterns
Strategy: validation
Validate before calling
func checkDefaultType(fieldType reflect.Type, def any) error {
if def == nil {
return nil
}
return valueAssignableTo(def, fieldType)
}
// call before registering the InputField Try / catch
if err := compileInput(...); err != nil {
if strings.HasPrefix(err.Error(), "default: ") {
// fix the default value's type before retrying
}
return err
} Prevention
- Derive defaults from typed constants of the same Go type as the field
- Add a unit test that compiles every shortcut's inputs so mismatches fail in CI
- When changing a field's type, grep for its defaultValue in the same change
When it happens
Trigger: Declaring an InputField with a defaultValue whose Go type does not match the field's valueType, e.g. a string default on an int field, an int default on a string field, or a value that cannot unmarshal into a slice/struct type. Raised by compileInput during shortcut compilation and exercised by TestParseCLITagRejectsInvalidGrammar.
Common situations: Refactoring a field's Go type (int -> string) without updating the default; copying a default from a sibling field with a different type; using JSON text as a default for a complex field that expects assignment, not a JSON string.
Related errors
AI-assisted analysis of larksuite/cli@7fd6ef3c07 (2026-09-04).
Data as JSON: /api/errors/56a70e297adafb8c.
Report an issue: GitHub.