Automate the creation of methods that copy from src struct to target struct
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
example
.gitignore
Gopkg.lock
Gopkg.toml
LICENSE
README.md
main.go

README.md

repacker

Automate the creation of methods that copy from src struct to target struct

Feature

  • Copy fields with the same filed name
  • Use the struct tag for different field names
  • Converte type as much as possible (e.g. time.time → string)
  • Support vendor directory
  • Support tne nested struct

Usage

Basic Usage

Two structs that have the same field.
See example

$ cd example/simple
$ cat foo/foo.go
package foo

type FooSimple struct {
        ID     int
        Name   string
        Detail string
}

$ cat bar/bar.go
package bar

type BarSimple struct {
        ID     int
        Name   string
        Detail string
}

You can specify src type such as ${import_path}.${struct_name}
e.g. github.com/knqyf263/test_repacker.Bar

Run repacker.

$ repacker -dst=FooSimple -src=github.com/knqyf263/repacker/example/simple/bar.BarSimple foo/

Automatically creates a method that copy from BarSimple to FooSimple.

$ cat foo/foosimple_repack.go
// Code generated by "repacker -dst=FooSimple -src=github.com/knqyf263/repacker/example/simple/bar.BarSimple foo/"; DO NOT EDIT

package foo

import "github.com/knqyf263/repacker/example/simple/bar"

// NewFooSimpleFromBarBarSimple creates *FooSimple from *bar.BarSimple
func NewFooSimpleFromBarBarSimple(s *bar.BarSimple) *FooSimple {
        return &FooSimple{
                ID:     s.ID,
                Name:   s.Name,
                Detail: s.Detail,
        }
}

Struct tag

Add the same struct tag to the fields you want to copy See example

$ cd example/tag
$ cat foo/foo.go
package foo

type FooTag struct {
        ID   int
        Name string
        Foo  string `repack:"foo"`
}

$ cat bar/bar.go
package bar

type BarTag struct {
        ID   int
        Name string
        Bar  string `repack:"foo"`
}

Run repacker.

$ repacker -dst=FooTag -src=github.com/knqyf263/repacker/example/tag/bar.BarTag foo/
repacker: Generating...
repacker: Lookup bar.BarTag
repacker: Lookup foo.FooTag
$ cat foo/footag_repack.go
// Code generated by "repacker -dst=FooTag -src=github.com/knqyf263/repacker/example/tag/bar.BarTag foo/"; DO NOT EDIT

package foo

import "github.com/knqyf263/repacker/example/tag/bar"

// NewFooTagFromBarBarTag creates *FooTag from *bar.BarTag
func NewFooTagFromBarBarTag(s *bar.BarTag) *FooTag {
        return &FooTag{
                ID:   s.ID,
                Name: s.Name,
                Foo:  s.Bar,
        }
}

Different Type

Converte types as much as possible (e.g. time.time → string)
See example.

$ cd example/conversion
$ cat foo/foo.go
package foo

type Foo struct {
        ID        int
        Name      string
        CreatedAt *string
}

$ cat bar/bar.go
package bar

import "time"

type Bar struct {
        ID   int
        Name string
        CreatedAt time.Time
}

Run repacker

$ repacker -dst=FooConversion -src=github.com/knqyf263/repacker/example/conversion/bar.BarConversion foo/
repacker: Generating...
repacker: Lookup bar.BarConversion
repacker: Lookup foo.FooConversion
$ cat foo/fooconversion_repack.go
// Code generated by "repacker -dst=FooConversion -src=github.com/knqyf263/repacker/example/conversion/bar.BarConversion foo/"; DO NOT EDIT

package foo

import (
        "fmt"

        "github.com/knqyf263/repacker/example/conversion/bar"
)

// NewFooConversionFromBarBarConversion creates *FooConversion from *bar.BarConversion
func NewFooConversionFromBarBarConversion(s *bar.BarConversion) *FooConversion {
        createdAt := fmt.Sprint(s.CreatedAt)
        return &FooConversion{
                ID:        s.ID,
                Name:      s.Name,
                CreatedAt: &createdAt,
        }
}

Nested struct

If it is nested, it will recursively generate code automatically. See example.

$ cd example/nested
$ cat foo/foo.go
package foo

type Foo struct {
        ID   int
        Name string
        Nest NestedFoo
}

type NestedFoo struct {
        ID int
}

$ cat bar/bar.go
package bar

type Bar struct {
        ID   int
        Name string
        Nest NestedBar
}

type NestedBar struct {
        ID int
}

Run repacker

repacker -dst=Foo -src=github.com/knqyf263/repacker/example/nested/bar.Bar foo/ 
repacker: Generating...
repacker: Lookup bar.Bar
repacker: Lookup foo.Foo
repacker: Lookup bar.NestedBar
repacker: Lookup foo.NestedFoo
$ cat foo/foo_repack.go
// Code generated by "repacker -dst=Foo -src=github.com/knqyf263/repacker/example/nested/bar.Bar foo/"; DO NOT EDIT

package foo

import "github.com/knqyf263/repacker/example/nested/bar"

// NewNestedFooFromBarNestedBar creates *NestedFoo from *bar.NestedBar
func NewNestedFooFromBarNestedBar(s *bar.NestedBar) *NestedFoo {
        return &NestedFoo{
                ID: s.ID,
        }
}

// NewFooFromBarBar creates *Foo from *bar.Bar
func NewFooFromBarBar(s *bar.Bar) *Foo {
        return &Foo{
                ID:   s.ID,
                Name: s.Name,
                Nest: *NewNestedFooFromBarNestedBar(&s.Nest),
        }
}

go generate

Generate code by go generate

$ cd example/conversion
$ cat foo/foo.go
package foo

//go:generate repacker -dst=FooConversion -src=github.com/knqyf263/repacker/example/conversion/bar.BarConversion

type Foo struct {
        ID   int
        Name string
        Foo  string `repack:"foo"`
}
$ go generate ./...