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

  1. Inspect the wrapped cause to find which interface method or referenced type broke generation.
  2. Restrict interface methods to supported Dagger types for all parameters and return values.
  3. 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

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


AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05). Data as JSON: /api/errors/6f4f3afc2357db45. Report an issue: GitHub.