Designing for Composability
The type system is what lets Dagger workflows keep going. A well-typed result can be passed to another function, another module, a generated client, a check, a generator, or an agent.
Composable Return Values
Return values should help the caller continue the workflow:
- Return
Containerwhen the caller may still run, publish, export, or inspect it. - Return
DirectoryorFilewhen the caller needs artifacts. - Return
Servicewhen another step needs a live endpoint. - Return
Changesetwhen the module proposes source edits. - Return a user-defined object when the caller needs a domain concept with more methods.
Avoid Dead Ends
Strings and logs can be useful final outputs, but they are often dead ends. If a caller has to parse text to continue, the module probably returned too little structure.
Composition Across Modules
Design return types so other modules can consume them without knowing implementation details. This is where type design and interface design meet.
TODO: Cross-link this chapter with Interfaces and Composition after the interface guide is expanded.