Categorygithub.com/nao1215/vogen
modulepackage
0.0.1
Repository: https://github.com/nao1215/vogen.git
Documentation: pkg.go.dev

# README

vogen - Value Object Generator in golang

All Contributors

Go Reference Coverage reviewdog MultiPlatformUnitTest

The vogen library is to generate value objects in golang. The vogen will automatically generate files with Value Objects defined.

The vogen automatically generates Getter, Constructor, Constructor with Validation, and Equal() based on metadata (vogen.ValueObject).

Supported OS and go version

  • OS: Linux, macOS, Windows
  • Go: 1.22 or later

Example

Implement a value object metadata

Firstly, write your value object metadata. Here is an example: gen/main.go

package main

import (
	"fmt"
	"path/filepath"

	"github.com/nao1215/vogen"
)

//go:generate go run main.go

func main() {
	// Step 1: Create a Vogen instance with custom file path and package name.
	// By default, the file path is "value_objects.go" and the package name is "vo".
	gen, err := vogen.New(
		vogen.WithFilePath(filepath.Join("testdata", "example_output.go")),
		vogen.WithPackageName("vo_example"),
	)
	if err != nil {
		fmt.Printf("Failed to create Vogen instance: %v\n", err)
		return
	}

	// Step 2: Append the ValueObject definition
	if err := gen.AppendValueObjects(
		vogen.ValueObject{
			StructName: "Person",
			Fields: []vogen.Field{
				{
					Name: "Name", Type: "string",
					Comments: []string{"Name is the name of the person."},
					Validators: []vogen.Validator{
						vogen.NewStringLengthValidator(0, 120),
					},
				},
				{
					Name: "Age", Type: "int",
					Comments: []string{"Age is the age of the person."},
					Validators: []vogen.Validator{
						vogen.NewPositiveValueValidator(),
						vogen.NewMaxValueValidator(120),
					}},
			},
			Comments: []string{
				"Person is a Value Object to describe the feature of vogen.",
				"This is sample comment.",
			},
		},
	); err != nil {
		fmt.Printf("Failed to append ValueObject: %v\n", err)
		return
	}

	// Step 3: Generate the code
	if err := gen.Generate(); err != nil {
		fmt.Printf("Failed to generate code: %v\n", err)
		return
	}
}

If you run 'go generate ./...', the following code will be generated in the example_vo.go file.

// Code generated by vogen. DO NOT EDIT.
package vo_example

import (
	"fmt"
)

// Person is a Value Object to describe the feature of vogen.
// This is sample comment.
type Person struct {
	// Name is the name of the person.
	name string
	// Age is the age of the person.
	age int
}

// NewPerson creates a new instance of Person.
func NewPerson(name string, age int) Person {
	return Person{name: name, age: age}
}

// NewPersonStrictly creates a new instance of Person with validation.
func NewPersonStrictly(name string, age int) (Person, error) {
	o := Person{name: name, age: age}
	if len(o.name) < 0 || len(o.name) > 120 {
		return fmt.Errorf("struct 'Person' field 'Name' length is out of range: %d", len(o.name))
	}
	if o.age < 0 {
		return fmt.Errorf("struct 'Person' field 'Age' value is negative: %d", age)
	}
	if o.age > 120 {
		return fmt.Errorf("struct 'Person' field 'Age' value exceeds the maximum value: %d", age)
	}
	return o, nil
}

// Name returns the name field.
func (o Person) Name() string {
	return o.name
}

// Age returns the age field.
func (o Person) Age() int {
	return o.age
}

// Equal checks if two Person objects are equal.
func (o Person) Equal(other Person) bool {
	return o.Name() == other.Name() && o.Age() == other.Age()
}

// Address represents a value object.
type Address struct {
	city string
}

// NewAddress creates a new instance of Address.
func NewAddress(city string) Address {
	return Address{city: city}
}

// City returns the city field.
func (o Address) City() string {
	return o.city
}

// Equal checks if two Address objects are equal.
func (o Address) Equal(other Address) bool {
	return o.City() == other.City()
}

Validation list

ValidatorDescription
NewPositiveValueValidator()Check if the value is positive.
NewNegativeValueValidator()Check if the value is negative.
NewMaxValueValidator(max int)Check if the value is less than to the maximum value.
NewMinValueValidator(min int)Check if the value is greater than to the minimum value.
NewStringLengthValidator(min, max int)Check if the length of the string is within the specified range.

License

MIT License

Contribution

First off, thanks for taking the time to contribute! See CONTRIBUTING.md for more information. Contributions are not only related to development. For example, GitHub Star motivates me to develop! Please feel free to contribute to this project.

Contributors ✨

Thanks goes to these wonderful people (emoji key):

CHIKAMATSU Naohiro
CHIKAMATSU Naohiro

💻

This project follows the all-contributors specification. Contributions of any kind welcome!

# Functions

New creates a new Vogen struct.
NewMaxValueValidator returns a new Max Value Validator.
NewMinValueValidator returns a new Min Value Validator.
NewNegativeValueValidator returns a new Negative Value Validator.
NewPositiveValueValidator returns a new Positive Value Validator.
NewRangeValueValidator returns a new Range Value Validator.
NewStringLengthValidator returns a new String Length Validator.
WithFilePath specifies the file path to be generated.
WithPackageName specifies the package name to be generated.

# Variables

ErrInvalidField is an error that occurs when the Field is not set.
ErrInvalidFieldName is an error that occurs when the Field 'Name' is not set.
ErrInvalidFieldType is an error that occurs when the Field 'Type' is not set.
ErrInvalidFilePath is an error that occurs when the file path is not set.
ErrInvalidPackageName is an error that occurs when the package name is not set.
ErrStructNameEmpty is an error that occurs when the StructName is not set.

# Structs

Field is set to the metadata of the field to be automatically generated.
MaxValueValidator is a Max Value Validator.
MinValueValidator is a Min Value Validator.
NegativeValueValidator is a Negative Value Validator.
PositiveValueValidator is a Positive Value Validator.
RangeValueValidator is a Range Value Validator.
StringLengthValidator is a String Length Validator.
ValueObject is set to the metadata of the ValueObject to be automatically generated.
Vogen is the main struct of the vogen package.

# Interfaces

Validator represents a validator.

# Type aliases

Option is a parameter to be specified when creating a new Vogen struct.