Code Monkey home page Code Monkey logo

gonstructor's Introduction

gonstructor

A command-line tool to generate a constructor for the struct.

Installation

$ go get -u github.com/moznion/gonstructor/cmd/gonstructor

Also, you can get the pre-built binaries on Releases.

Or get it with gobinaries.com:

curl -sf https://gobinaries.com/moznion/gonstructor | sh

Dependencies

gonstructor depends on goimports for fixing import paths and formatting code, you need to install it:

$ go get golang.org/x/tools/cmd/goimports

Usage

Usage of gonstructor:
  -constructorTypes string
        [optional] comma-separated list of constructor types; it expects "allArgs" and "builder" (default "allArgs")
  -init string
        [optional] name of function to call on object after creating it
  -output string
        [optional] output file name (default "srcdir/<type>_gen.go")
  -type string
        [mandatory] a type name
  -version
        [optional] show the version information
  -withGetter
        [optional] generate a constructor along with getter functions for each field

Motivation

Data encapsulation is a good practice to make software, and it is necessary to clearly indicate the boundary of the structure by controlling the accessibility of the data fields (i.e. private or public) for that. Basically keeping the data fields be private and immutable would be good to make software be robust because it can avoid unexpected field changing.

Golang has a simple way to do that by choosing the initial character's type: upper case or lower case. Once it has decided to use a field as private, it needs to make something like a constructor function, but golang doesn't have a mechanism to support constructor now.

Therefore this project aims to automatically generate constructors to use structures with private and immutable, easily.

Pre requirements to run

Synopsis

Generate all args constructor

  1. write a struct type with go:generate

e.g.

//go:generate gonstructor --type=Structure --constructorTypes=allArgs"
type Structure struct {
	foo string
	bar io.Reader
	Buz chan interface{}
}
  1. execute go generate ./...
  2. then gonstructor generates a constructor code

e.g.

func NewStructure(foo string, bar io.Reader, buz chan interface{}) *Structure {
	return &Structure{foo: foo, bar: bar, Buz: buz}
}

Generate builder (builder means GoF pattern's one)

  1. write a struct type with go:generate

e.g.

//go:generate gonstructor --type=Structure --constructorTypes=builder"
type Structure struct {
	foo string
	bar io.Reader
	Buz chan interface{}
}
  1. execute go generate ./...
  2. then gonstructor generates a buildr code

e.g.

type StructureBuilder struct {
	foo        string
	bar        io.Reader
	buz        chan interface{}
	bufferSize int
}

func NewStructureBuilder() *StructureBuilder {
	return &StructureBuilder{}
}

func (b *StructureBuilder) Foo(foo string) *StructureBuilder {
	b.foo = foo
	return b
}

func (b *StructureBuilder) Bar(bar io.Reader) *StructureBuilder {
	b.bar = bar
	return b
}

func (b *StructureBuilder) Buz(buz chan interface{}) *StructureBuilder {
	b.buz = buz
	return b
}

func (b *StructureBuilder) BufferSize(bufferSize int) *StructureBuilder {
	b.bufferSize = bufferSize
	return b
}

func (b *StructureBuilder) Build() *Structure {
	return &Structure{
		foo:        b.foo,
		bar:        b.bar,
		Buz:        b.buz,
		bufferSize: b.bufferSize,
	}
}

Call a initializer

  1. write a struct type with go:generate
  2. write a function that initializes internal fields
  3. pass its name to -init parameter

e.g.

//go:generate gonstructor --type=Structure -init construct
type Structure struct {
	foo        string
	bar        io.Reader
	Buz        chan interface{}
	bufferSize int
	buffer     chan []byte `gonstructor:"-"`
}

func (structure *Structure) construct() {
	structure.buffer = make(chan []byte, structure.bufferSize)
}
  1. execute go generate ./...
  2. then gonstructor generates a buildr code

e.g.

func NewStructure(
	foo string,
	bar io.Reader,
	buz chan interface{},
	bufferSize int,
) *Structure {
	r := &Structure{
		foo:        foo,
		bar:        bar,
		Buz:        buz,
		bufferSize: bufferSize,
	}

	r.construct()

	return r
}

How to ignore to contain a field in a constructor

gonstructor:"-" supports that.

e.g.

type Structure struct {
	foo string
	bar int64 `gonstructor:"-"`
}

The generated code according to the above structure doesn't contain bar field.

How to build binaries

Binaries are built and uploaded by goreleaser. Please refer to the configuration file: .goreleaser.yml

Author

moznion ([email protected])

gonstructor's People

Contributors

kovetskiy avatar mattn avatar moznion avatar mushus avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.