|
|
@@ -33,6 +33,7 @@ var (
|
|
|
flagTypes = flag.String("type", "", "comma-separated list of types; required")
|
|
|
flagOutput = flag.String("output", "", "output file; required")
|
|
|
flagBuildTags = flag.String("tags", "", "compiler build tags to apply")
|
|
|
+ flagCloneFunc = flag.Bool("clonefunc", false, "add a top-level Clone func")
|
|
|
)
|
|
|
|
|
|
func main() {
|
|
|
@@ -98,25 +99,27 @@ func main() {
|
|
|
w := func(format string, args ...interface{}) {
|
|
|
fmt.Fprintf(buf, format+"\n", args...)
|
|
|
}
|
|
|
- w("// Clone duplicates src into dst and reports whether it succeeded.")
|
|
|
- w("// To succeed, <src, dst> must be of types <*T, *T> or <*T, **T>,")
|
|
|
- w("// where T is one of %s.", *flagTypes)
|
|
|
- w("func Clone(dst, src interface{}) bool {")
|
|
|
- w(" switch src := src.(type) {")
|
|
|
- for _, typeName := range typeNames {
|
|
|
- w(" case *%s:", typeName)
|
|
|
- w(" switch dst := dst.(type) {")
|
|
|
- w(" case *%s:", typeName)
|
|
|
- w(" *dst = *src.Clone()")
|
|
|
- w(" return true")
|
|
|
- w(" case **%s:", typeName)
|
|
|
- w(" *dst = src.Clone()")
|
|
|
- w(" return true")
|
|
|
- w(" }")
|
|
|
+ if *flagCloneFunc {
|
|
|
+ w("// Clone duplicates src into dst and reports whether it succeeded.")
|
|
|
+ w("// To succeed, <src, dst> must be of types <*T, *T> or <*T, **T>,")
|
|
|
+ w("// where T is one of %s.", *flagTypes)
|
|
|
+ w("func Clone(dst, src interface{}) bool {")
|
|
|
+ w(" switch src := src.(type) {")
|
|
|
+ for _, typeName := range typeNames {
|
|
|
+ w(" case *%s:", typeName)
|
|
|
+ w(" switch dst := dst.(type) {")
|
|
|
+ w(" case *%s:", typeName)
|
|
|
+ w(" *dst = *src.Clone()")
|
|
|
+ w(" return true")
|
|
|
+ w(" case **%s:", typeName)
|
|
|
+ w(" *dst = src.Clone()")
|
|
|
+ w(" return true")
|
|
|
+ w(" }")
|
|
|
+ }
|
|
|
+ w(" }")
|
|
|
+ w(" return false")
|
|
|
+ w("}")
|
|
|
}
|
|
|
- w(" }")
|
|
|
- w(" return false")
|
|
|
- w("}")
|
|
|
|
|
|
contents := new(bytes.Buffer)
|
|
|
fmt.Fprintf(contents, header, *flagTypes, pkg.Name)
|