# binary will be $(go env GOPATH)/bin/digen
sh -c "$(curl --location https://raw.githubusercontent.com/strider2038/digen/master/install.sh)" -- -d -b $(go env GOPATH)/bin
digen versiongo install github.com/strider2038/digen/cmd/digen@latest
digen versionTo initialize new container skeleton run command.
digen initThen describe your service definitions in the Container struct (<workdir>/internal/definitions/container.go).
See examples.
After any update run digen generate command to generate container and factories.
- base directory (recommended name
di)container.go- generated public containerinternal- directory with internal packagescontainer.go- generated internal di containerdefinitions- package with container and service definitions (configuration file)container.go- structs describing di containers (describe here your services)
factories- package with manually written factory functions to build up services
lookup- directory with lookup container contractscontainer.go- generated interfaces for internal di container (to use in factories package)
There are two ways to set up service definition options: by tags and by comments. When both are present, options by tags will override options by comments (flags will be merged).
- tag
difor flag options:set- to generate setters for internal and public containers;close- to generate closer method call;required- to generate argument for public container constructor;public- to generate getter for public container.
- tag
factory_pkgto set up factory package; - tag
factory_nameto set up factory filename (without extension); - tag
public_nameto override service getter for public container.
Example of definitions/container.go using tags.
type Container struct {
Configuration config.Configuration `di:"required"`
Logger *log.Logger `di:"required"`
Conn *sql.Conn `di:"set,close"`
Handler *httpadapter.GetEntityHandler `di:"public"`
UseCases UseCaseContainer
Repositories RepositoryContainer
}
type UseCaseContainer struct {
FindEntity *usecase.FindEntity
}
type RepositoryContainer struct {
EntityRepository domain.EntityRepository `di:"set"`
}Example of definitions/container.go using comments.
type Container struct {
// di: required
Configuration config.Configuration
// di: required
Logger *log.Logger
// di: set,close
Conn *sql.Conn
// di: public
// di: factory_pkg: example.com/test/infrastructure/api/http
// di: factory_name: handler
Handler *httpadapter.GetEntityHandler
UseCases UseCaseContainer
Repositories RepositoryContainer
}
type UseCaseContainer struct {
FindEntity *usecase.FindEntity
}
type RepositoryContainer struct {
// di: set
EntityRepository domain.EntityRepository
}DIGEN configuration can be presented in digen.yaml/digen.yml/digen.json file in the project root directory.
version: v0.2
container:
# base directory with Dependency Injection Container files
dir: di # required
factories:
# option can be used to disable return error by default
returnError: true
errorHandling:
# options for error handling
# default values described below, can be omitted
new:
pkg: 'fmt'
func: 'Errorf'
join:
pkg: 'errors'
func: 'Join'
wrap:
pkg: 'fmt'
func: 'Errorf'
verb: '%w'- public container generator
- use cobra/viper
-
SetErrormethod - generate package docs
- skeleton generation command (init)
- import definitions package
- remove unnecessary imports
- definitions generator
- handle multiple containers
- better console output via logger
- definitions for multiple containers
- unique names for separate container definitions
- prompt for init (set work_dir, write first config)
- better generation with
_config.gofile - apply gofmt
- move contracts into separate package
- generate README.md for root package
- ability to choose specific file for factory func
- ability to set public definition name
- check app version in config
- force variable name / package name uniqueness
- custom close functions
- describe basic app example
- add complex app example with tests and fake repository
- definitions updater
- remove
SetErrormethod - write doc