The linter checks that the Structes are created by the Factory, and not directly.
The checking helps to provide invariants without exclusion and helps avoid creating an invalid object.
Use
Installation
go install github.com/maranqz/go-factory-lint/cmd/go-factory-lint@latest
Options
-b, --blockedPkgs - list of packages, where the structures should be created by factories. By default, all structures in all packages should be created by factories, tests.
-ob, onlyBlockedPkgs - only blocked packages should use factory to initiate struct, tests.
Example
Bad
Good
package main
import (
"fmt"
"bad"
)
func main() {
// Use factory for bad.User
u := &bad.User{
ID: -1,
}
fmt.Println(u.ID) // -1
fmt.Println(u.CreatedAt) // time.Time{}
}
package bad
import "time"
type User struct {
ID int64
CreatedAt time.Time
}
var sequenceID = int64(0)
func NextID() int64 {
sequenceID++
return sequenceID
}
package main
import (
"fmt"
"good"
)
func main() {
u := good.NewUser()
fmt.Println(u.ID) // auto increment
fmt.Println(u.CreatedAt) // time.Now()
}
package user
import "time"
type User struct {
ID int64
CreatedAt time.Time
}
func NewUser() *User {
return &User{
ID: nextID(),
CreatedAt: time.Now(),
}
}
var sequenceID = int64(0)
func nextID() int64 {
sequenceID++
return sequenceID
}
TODO
Features that are difficult to implement and unplanned
Type assertion, type declaration and type underlying, tests.