repacker

command module
v0.0.0-...-9fe761d Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 19, 2018 License: MIT Imports: 19 Imported by: 0

README

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 ./...

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
example

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL