dagger/dagger · error
failed to generate concrete struct code for %s: %w
Error message
failed to generate concrete struct code for %s: %w
What it means
Wrapping error from the IfaceVisitor in moduleMainSrc: when a module exposes a named interface type, codegen generates a concrete struct implementing that interface; generating that concrete struct's ImplementationCode failed. The failing interface's name is included and the underlying cause is preserved with %w.
Source
Thrown at cmd/codegen/generator/go/templates/modules.go:173
implCode, err := objTypeSpec.ImplementationCode()
if err != nil {
return fmt.Errorf("failed to generate json method code for %s: %w", obj.Name(), err)
}
implementationCode.Add(implCode).Line()
objTypeDefCode, err := objTypeSpec.TypeDefCode()
if err != nil {
return fmt.Errorf("failed to generate type def code for %s: %w", obj.Name(), err)
}
createMod = dotLine(createMod, "WithObject").Call(Add(Line(), objTypeDefCode))
return nil
},
IfaceVisitor: func(ps *parseState, named *types.Named, obj *types.TypeName, ifaceTypeSpec *parsedIfaceType, iface *types.Interface) error {
// Add the iface to the module
implCode, err := ifaceTypeSpec.ImplementationCode()
if err != nil {
return fmt.Errorf("failed to generate concrete struct code for %s: %w", obj.Name(), err)
}
implementationCode.Add(implCode).Line()
ifaceTypeDefCode, err := ifaceTypeSpec.TypeDefCode()
if err != nil {
return fmt.Errorf("failed to generate type def code for %s: %w", obj.Name(), err)
}
createMod = dotLine(createMod, "WithInterface").Call(Add(Line(), ifaceTypeDefCode))
return nil
},
EnumVisitor: func(ps *parseState, named *types.Named, obj *types.TypeName, enumTypeSpec *parsedEnumType, enum *types.Basic) error {
// Add the enum to the module
implCode, err := enumTypeSpec.ImplementationCode()
if err != nil {
return fmt.Errorf("failed to generate enum code for %s: %w", obj.Name(), err)
}
implementationCode.Add(implCode).Line()View on GitHub (pinned to 82ba2681db)
Solutions
- Inspect the wrapped cause to find which interface method or referenced type broke generation.
- Restrict interface methods to supported Dagger types for all parameters and return values.
- Regenerate with `dagger develop`, ensure dependent modules load correctly, and update the Dagger CLI/SDK if the input code is valid.
Example fix
// before
type Publisher interface {
Subscribe(cb func(string)) error
}
// after
type Publisher interface {
Publish(msg string) error
} Defensive patterns
Strategy: try-catch
Validate before calling
// Ensure all interface methods use supported param/return types before codegen.
func validateIfaceMethods(t reflect.Type) error {
for i := 0; i < t.NumMethod(); i++ {
m := t.Method(i)
for j := 0; j < m.Type.NumIn(); j++ {
if k := m.Type.In(j).Kind(); k == reflect.Func || k == reflect.Chan || k == reflect.Map {
return fmt.Errorf("method %s arg %d has unsupported kind %v", m.Name, j, k)
}
}
}
return nil
} Try / catch
if err := codegen(); err != nil && strings.Contains(err.Error(), "failed to generate concrete struct code") {
log.Fatalf("interface codegen failed: %v", errors.Unwrap(err))
} Prevention
- Design module interfaces with only supported Dagger types in method signatures.
- Keep dependent modules resolvable and their generated code current.
- Regenerate dagger.gen.go after any interface change; never edit generated concrete structs by hand.
When it happens
Trigger: ifaceTypeSpec.ImplementationCode() errors while emitting the concrete struct for a module interface — typically because an interface method has parameters/returns of types the codegen cannot model, or a referenced subtype fails to parse.
Common situations: Interfaces with methods taking/returning unsupported Go types (funcs, channels, maps), interfaces referencing types from a dependency module that failed to load, or hand-edited generated code drifting from user interfaces.
Related errors
- interface types must be named
- could not encode default value %q: %w
- expected struct type for %s
- unexpected context type in inline field %s
- unexpected context type for arg %s
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/6f4f3afc2357db45.
Report an issue: GitHub.