package jen_test import ( "fmt" "bytes" . "github.com/dave/jennifer/jen" ) func ExampleCaseBug() { c := Switch(Id("a")).Block( Case(Lit(1)).Block( Var().Id("i").Int(), Var().Id("j").Int(), ), ) fmt.Printf("%#v", c) // Output: // switch a { // case 1: // var i int // var j int // } } func ExampleCustom() { multiLineCall := Options{ Close: ")", Multi: true, Open: "(", Separator: ",", } c := Id("foo").Custom(multiLineCall, Lit("a"), Lit("b"), Lit("c")) fmt.Printf("%#v", c) // Output: // foo( // "a", // "b", // "c", // ) } func ExampleCustomFunc() { multiLineCall := Options{ Close: ")", Multi: true, Open: "(", Separator: ",", } c := Id("foo").CustomFunc(multiLineCall, func(g *Group) { g.Lit("a") g.Lit("b") g.Lit("c") }) fmt.Printf("%#v", c) // Output: // foo( // "a", // "b", // "c", // ) } func ExampleFile_ImportName_conflict() { f := NewFile("main") // We provide a hint that package foo/a should use name "a", but because package bar/a already // registers the required name, foo/a is aliased. f.ImportName("github.com/foo/a", "a") f.Func().Id("main").Params().Block( Qual("github.com/bar/a", "Bar").Call(), Qual("github.com/foo/a", "Foo").Call(), ) fmt.Printf("%#v", f) // Output: // package main // // import ( // a "github.com/bar/a" // a1 "github.com/foo/a" // ) // // func main() { // a.Bar() // a1.Foo() // } } func ExampleFile_ImportAlias_conflict() { f := NewFile("main") // We provide a hint that package foo/a should use alias "b", but because package bar/b already // registers the required name, foo/a is aliased using the requested alias as a base. f.ImportName("github.com/foo/a", "b") f.Func().Id("main").Params().Block( Qual("github.com/bar/b", "Bar").Call(), Qual("github.com/foo/a", "Foo").Call(), ) fmt.Printf("%#v", f) // Output: // package main // // import ( // b "github.com/bar/b" // b1 "github.com/foo/a" // ) // // func main() { // b.Bar() // b1.Foo() // } } func ExampleFile_ImportName() { f := NewFile("main") // package a should use name "a" f.ImportName("github.com/foo/a", "a") // package b is not used in the code so will not be included f.ImportName("github.com/foo/b", "b") f.Func().Id("main").Params().Block( Qual("github.com/foo/a", "A").Call(), ) fmt.Printf("%#v", f) // Output: // package main // // import "github.com/foo/a" // // func main() { // a.A() // } } func ExampleFile_ImportNames() { // package a should use name "a", package b is not used in the code so will not be included names := map[string]string{ "github.com/foo/a": "a", "github.com/foo/b": "b", } f := NewFile("main") f.ImportNames(names) f.Func().Id("main").Params().Block( Qual("github.com/foo/a", "A").Call(), ) fmt.Printf("%#v", f) // Output: // package main // // import "github.com/foo/a" // // func main() { // a.A() // } } func ExampleFile_ImportAlias() { f := NewFile("main") // package a should be aliased to "b" f.ImportAlias("github.com/foo/a", "b") // package c is not used in the code so will not be included f.ImportAlias("github.com/foo/c", "c") f.Func().Id("main").Params().Block( Qual("github.com/foo/a", "A").Call(), ) fmt.Printf("%#v", f) // Output: // package main // // import b "github.com/foo/a" // // func main() { // b.A() // } } func ExampleFile_ImportAliasDot() { f := NewFile("main") // package a should be a dot-import f.ImportAlias("github.com/foo/a", ".") // package b should be a dot-import f.ImportAlias("github.com/foo/b", ".") // package c is not used in the code so will not be included f.ImportAlias("github.com/foo/c", ".") f.Func().Id("main").Params().Block( Qual("github.com/foo/a", "A").Call(), Qual("github.com/foo/b", "B").Call(), ) fmt.Printf("%#v", f) // Output: // package main // // import ( // . "github.com/foo/a" // . "github.com/foo/b" // ) // // func main() { // A() // B() // } } func ExampleFile_CgoPreamble() { f := NewFile("a") f.CgoPreamble(`#include #include void myprint(char* s) { printf("%s\n", s); } `) f.Func().Id("init").Params().Block( Id("cs").Op(":=").Qual("C", "CString").Call(Lit("Hello from stdio\n")), Qual("C", "myprint").Call(Id("cs")), Qual("C", "free").Call(Qual("unsafe", "Pointer").Parens(Id("cs"))), ) fmt.Printf("%#v", f) // Output: // package a // // import "unsafe" // // /* // #include // #include // // void myprint(char* s) { // printf("%s\n", s); // } // */ // import "C" // // func init() { // cs := C.CString("Hello from stdio\n") // C.myprint(cs) // C.free(unsafe.Pointer(cs)) // } } func ExampleFile_CgoPreamble_anon() { f := NewFile("a") f.CgoPreamble(`#include `) f.Func().Id("init").Params().Block( Qual("foo.bar/a", "A"), Qual("foo.bar/b", "B"), ) fmt.Printf("%#v", f) // Output: // package a // // import ( // a "foo.bar/a" // b "foo.bar/b" // ) // // // #include // import "C" // // func init() { // a.A // b.B // } } func ExampleFile_CgoPreamble_no_preamble() { f := NewFile("a") f.Func().Id("init").Params().Block( Qual("C", "Foo").Call(), Qual("fmt", "Print").Call(), ) fmt.Printf("%#v", f) // Output: // package a // // import ( // "C" // "fmt" // ) // // func init() { // C.Foo() // fmt.Print() // } } func ExampleFile_CgoPreamble_no_preamble_single() { f := NewFile("a") f.Func().Id("init").Params().Block( Qual("C", "Foo").Call(), ) fmt.Printf("%#v", f) // Output: // package a // // import "C" // // func init() { // C.Foo() // } } func ExampleFile_CgoPreamble_no_preamble_single_anon() { f := NewFile("a") f.Anon("C") f.Func().Id("init").Params().Block() fmt.Printf("%#v", f) // Output: // package a // // import "C" // // func init() {} } func ExampleFile_CgoPreamble_no_preamble_anon() { f := NewFile("a") f.Anon("C") f.Func().Id("init").Params().Block( Qual("fmt", "Print").Call(), ) fmt.Printf("%#v", f) // Output: // package a // // import ( // "C" // "fmt" // ) // // func init() { // fmt.Print() // } } func ExampleOp_complex_conditions() { c := If(Parens(Id("a").Op("||").Id("b")).Op("&&").Id("c")).Block() fmt.Printf("%#v", c) // Output: // if (a || b) && c { // } } func ExampleLit_bool_true() { c := Lit(true) fmt.Printf("%#v", c) // Output: // true } func ExampleLit_bool_false() { c := Lit(false) fmt.Printf("%#v", c) // Output: // false } func ExampleLit_byte() { // Lit can't tell the difference between byte and uint8. Use LitByte to // render byte literals. c := Lit(byte(0x1)) fmt.Printf("%#v", c) // Output: // uint8(0x1) } func ExampleLit_complex64() { c := Lit(complex64(0 + 0i)) fmt.Printf("%#v", c) // Output: // complex64(0 + 0i) } func ExampleLit_complex128() { c := Lit(0 + 0i) fmt.Printf("%#v", c) // Output: // (0 + 0i) } func ExampleLit_float32() { c := Lit(float32(1)) fmt.Printf("%#v", c) // Output: // float32(1) } func ExampleLit_float64_one_point_zero() { c := Lit(1.0) fmt.Printf("%#v", c) // Output: // 1.0 } func ExampleLit_float64_zero() { c := Lit(0.0) fmt.Printf("%#v", c) // Output: // 0.0 } func ExampleLit_float64_negative() { c := Lit(-0.1) fmt.Printf("%#v", c) // Output: // -0.1 } func ExampleLit_float64_negative_whole() { c := Lit(-1.0) fmt.Printf("%#v", c) // Output: // -1.0 } func ExampleLit_int() { c := Lit(1) fmt.Printf("%#v", c) // Output: // 1 } func ExampleLit_int8() { c := Lit(int8(1)) fmt.Printf("%#v", c) // Output: // int8(1) } func ExampleLit_int16() { c := Lit(int16(1)) fmt.Printf("%#v", c) // Output: // int16(1) } func ExampleLit_int32() { c := Lit(int32(1)) fmt.Printf("%#v", c) // Output: // int32(1) } func ExampleLit_int64() { c := Lit(int64(1)) fmt.Printf("%#v", c) // Output: // int64(1) } func ExampleLit_uint() { c := Lit(uint(0x1)) fmt.Printf("%#v", c) // Output: // uint(0x1) } func ExampleLit_uint8() { c := Lit(uint8(0x1)) fmt.Printf("%#v", c) // Output: // uint8(0x1) } func ExampleLit_uint16() { c := Lit(uint16(0x1)) fmt.Printf("%#v", c) // Output: // uint16(0x1) } func ExampleLit_uint32() { c := Lit(uint32(0x1)) fmt.Printf("%#v", c) // Output: // uint32(0x1) } func ExampleLit_uint64() { c := Lit(uint64(0x1)) fmt.Printf("%#v", c) // Output: // uint64(0x1) } func ExampleLit_uintptr() { c := Lit(uintptr(0x1)) fmt.Printf("%#v", c) // Output: // uintptr(0x1) } func ExampleLit_rune() { // Lit can't tell the difference between rune and int32. Use LitRune to // render rune literals. c := Lit('x') fmt.Printf("%#v", c) // Output: // int32(120) } func ExampleLitRune() { c := LitRune('x') fmt.Printf("%#v", c) // Output: // 'x' } func ExampleLitRuneFunc() { c := LitRuneFunc(func() rune { return '\t' }) fmt.Printf("%#v", c) // Output: // '\t' } func ExampleLitByte() { c := LitByte(byte(1)) fmt.Printf("%#v", c) // Output: // byte(0x1) } func ExampleLitByteFunc() { c := LitByteFunc(func() byte { return byte(2) }) fmt.Printf("%#v", c) // Output: // byte(0x2) } func ExampleLit_string() { c := Lit("foo") fmt.Printf("%#v", c) // Output: // "foo" } func ExampleValues_dict_single() { c := Map(String()).String().Values(Dict{ Lit("a"): Lit("b"), }) fmt.Printf("%#v", c) // Output: // map[string]string{"a": "b"} } func ExampleValues_dict_multiple() { c := Map(String()).String().Values(Dict{ Lit("a"): Lit("b"), Lit("c"): Lit("d"), }) fmt.Printf("%#v", c) // Output: // map[string]string{ // "a": "b", // "c": "d", // } } func ExampleValues_dict_composite() { c := Op("&").Id("Person").Values(Dict{ Id("Age"): Lit(1), Id("Name"): Lit("a"), }) fmt.Printf("%#v", c) // Output: // &Person{ // Age: 1, // Name: "a", // } } func ExampleAdd() { ptr := Op("*") c := Id("a").Op("=").Add(ptr).Id("b") fmt.Printf("%#v", c) // Output: // a = *b } func ExampleAdd_var() { a := Id("a") i := Int() c := Var().Add(a, i) fmt.Printf("%#v", c) // Output: // var a int } func ExampleAppend() { c := Append(Id("a"), Id("b")) fmt.Printf("%#v", c) // Output: // append(a, b) } func ExampleAppend_more() { c := Id("a").Op("=").Append(Id("a"), Id("b").Op("...")) fmt.Printf("%#v", c) // Output: // a = append(a, b...) } func ExampleAssert() { c := List(Id("b"), Id("ok")).Op(":=").Id("a").Assert(Bool()) fmt.Printf("%#v", c) // Output: // b, ok := a.(bool) } func ExampleBlock() { c := Func().Id("foo").Params().String().Block( Id("a").Op("=").Id("b"), Id("b").Op("++"), Return(Id("b")), ) fmt.Printf("%#v", c) // Output: // func foo() string { // a = b // b++ // return b // } } func ExampleBlock_if() { c := If(Id("a").Op(">").Lit(10)).Block( Id("a").Op("=").Id("a").Op("/").Lit(2), ) fmt.Printf("%#v", c) // Output: // if a > 10 { // a = a / 2 // } } func ExampleValuesFunc() { c := Id("numbers").Op(":=").Index().Int().ValuesFunc(func(g *Group) { for i := 0; i <= 5; i++ { g.Lit(i) } }) fmt.Printf("%#v", c) // Output: // numbers := []int{0, 1, 2, 3, 4, 5} } func ExampleBlockFunc() { increment := true name := "a" c := Func().Id("a").Params().BlockFunc(func(g *Group) { g.Id(name).Op("=").Lit(1) if increment { g.Id(name).Op("++") } else { g.Id(name).Op("--") } }) fmt.Printf("%#v", c) // Output: // func a() { // a = 1 // a++ // } } func ExampleBool() { c := Var().Id("b").Bool() fmt.Printf("%#v", c) // Output: // var b bool } func ExampleBreak() { c := For( Id("i").Op(":=").Lit(0), Id("i").Op("<").Lit(10), Id("i").Op("++"), ).Block( If(Id("i").Op(">").Lit(5)).Block( Break(), ), ) fmt.Printf("%#v", c) // Output: // for i := 0; i < 10; i++ { // if i > 5 { // break // } // } } func ExampleByte() { c := Id("b").Op(":=").Id("a").Assert(Byte()) fmt.Printf("%#v", c) // Output: // b := a.(byte) } func ExampleCall() { c := Qual("fmt", "Printf").Call( Lit("%#v: %T\n"), Id("a"), Id("b"), ) fmt.Printf("%#v", c) // Output: // fmt.Printf("%#v: %T\n", a, b) } func ExampleCall_fmt() { c := Id("a").Call(Lit("b")) fmt.Printf("%#v", c) // Output: // a("b") } func ExampleCallFunc() { f := func(name string, second string) { c := Id("foo").CallFunc(func(g *Group) { g.Id(name) if second != "" { g.Lit(second) } }) fmt.Printf("%#v\n", c) } f("a", "b") f("c", "") // Output: // foo(a, "b") // foo(c) } func ExampleCap() { c := Id("i").Op(":=").Cap(Id("v")) fmt.Printf("%#v", c) // Output: // i := cap(v) } func ExampleCase() { c := Switch(Id("person")).Block( Case(Id("John"), Id("Peter")).Block( Return(Lit("male")), ), Case(Id("Gill")).Block( Return(Lit("female")), ), ) fmt.Printf("%#v", c) // Output: // switch person { // case John, Peter: // return "male" // case Gill: // return "female" // } } func ExampleBlock_case() { c := Select().Block( Case(Op("<-").Id("done")).Block( Return(Nil()), ), Case(List(Err(), Id("open")).Op(":=").Op("<-").Id("fail")).Block( If(Op("!").Id("open")).Block( Return(Err()), ), ), ) fmt.Printf("%#v", c) // Output: // select { // case <-done: // return nil // case err, open := <-fail: // if !open { // return err // } // } } func ExampleBlockFunc_case() { preventExitOnError := true c := Select().Block( Case(Op("<-").Id("done")).Block( Return(Nil()), ), Case(Err().Op(":=").Op("<-").Id("fail")).BlockFunc(func(g *Group) { if !preventExitOnError { g.Return(Err()) } else { g.Qual("fmt", "Println").Call(Err()) } }), ) fmt.Printf("%#v", c) // Output: // select { // case <-done: // return nil // case err := <-fail: // fmt.Println(err) // } } func ExampleCaseFunc() { samIsMale := false c := Switch(Id("person")).Block( CaseFunc(func(g *Group) { g.Id("John") g.Id("Peter") if samIsMale { g.Id("Sam") } }).Block( Return(Lit("male")), ), CaseFunc(func(g *Group) { g.Id("Gill") if !samIsMale { g.Id("Sam") } }).Block( Return(Lit("female")), ), ) fmt.Printf("%#v", c) // Output: // switch person { // case John, Peter: // return "male" // case Gill, Sam: // return "female" // } } func ExampleChan() { c := Func().Id("init").Params().Block( Id("c").Op(":=").Make(Chan().Qual("os", "Signal"), Lit(1)), Qual("os/signal", "Notify").Call(Id("c"), Qual("os", "Interrupt")), Qual("os/signal", "Notify").Call(Id("c"), Qual("syscall", "SIGTERM")), Go().Func().Params().Block( Op("<-").Id("c"), Id("cancel").Call(), ).Call(), ) fmt.Printf("%#v", c) // Output: // func init() { // c := make(chan os.Signal, 1) // signal.Notify(c, os.Interrupt) // signal.Notify(c, syscall.SIGTERM) // go func() { // <-c // cancel() // }() // } } func ExampleClose() { c := Block( Id("ch").Op(":=").Make(Chan().Struct()), Go().Func().Params().Block( Op("<-").Id("ch"), Qual("fmt", "Println").Call(Lit("done.")), ).Call(), Close(Id("ch")), ) fmt.Printf("%#v", c) // Output: // { // ch := make(chan struct{}) // go func() { // <-ch // fmt.Println("done.") // }() // close(ch) // } } func ExampleComment() { f := NewFile("a") f.Comment("Foo returns the string \"foo\"") f.Func().Id("Foo").Params().String().Block( Return(Lit("foo")).Comment("return the string foo"), ) fmt.Printf("%#v", f) // Output: // package a // // // Foo returns the string "foo" // func Foo() string { // return "foo" // return the string foo // } } func ExampleComment_multiline() { c := Comment("a\nb") fmt.Printf("%#v", c) // Output: // /* // a // b // */ } func ExampleComment_formatting_disabled() { c := Id("foo").Call(Comment("/* inline */")).Comment("//no-space") fmt.Printf("%#v", c) // Output: // foo( /* inline */ ) //no-space } func ExampleCommentf() { name := "foo" val := "bar" c := Id(name).Op(":=").Lit(val).Commentf("%s is the string \"%s\"", name, val) fmt.Printf("%#v", c) // Output: // foo := "bar" // foo is the string "bar" } func ExampleComplex() { c := Func().Id("main").Params().Block( Id("c1").Op(":=").Lit(1+3.75i), Id("c2").Op(":=").Complex(Lit(1), Lit(3.75)), Qual("fmt", "Println").Call(Id("c1").Op("==").Id("c2")), ) fmt.Printf("%#v", c) // Output: // func main() { // c1 := (1 + 3.75i) // c2 := complex(1, 3.75) // fmt.Println(c1 == c2) // } } func ExampleComplex128() { c := Func().Id("main").Params().Block( Var().Id("c").Complex128(), Id("c").Op("=").Lit(1+2i), Qual("fmt", "Println").Call(Id("c")), ) fmt.Printf("%#v", c) // Output: // func main() { // var c complex128 // c = (1 + 2i) // fmt.Println(c) // } } func ExampleComplex64() { c := Func().Id("main").Params().Block( Var().Id("c64").Complex64(), Id("c64").Op("=").Complex(Lit(5), Float32().Parens(Lit(2))), Qual("fmt", "Printf").Call(Lit("%T\n"), Id("c64")), ) fmt.Printf("%#v", c) // Output: // func main() { // var c64 complex64 // c64 = complex(5, float32(2)) // fmt.Printf("%T\n", c64) // } } func ExampleParams() { c := Func().Params( Id("a").Id("A"), ).Id("foo").Params( Id("b"), Id("c").String(), ).String().Block( Return(Id("b").Op("+").Id("c")), ) fmt.Printf("%#v", c) // Output: // func (a A) foo(b, c string) string { // return b + c // } } func ExampleIndex() { c := Var().Id("a").Index().String() fmt.Printf("%#v", c) // Output: // var a []string } func ExampleIndex_index() { c := Id("a").Op(":=").Id("b").Index(Lit(0), Lit(1)) fmt.Printf("%#v", c) // Output: // a := b[0:1] } func ExampleIndex_empty() { c := Id("a").Op(":=").Id("b").Index(Lit(1), Empty()) fmt.Printf("%#v", c) // Output: // a := b[1:] } func ExampleOp() { c := Id("a").Op(":=").Id("b").Call() fmt.Printf("%#v", c) // Output: // a := b() } func ExampleOp_star() { c := Id("a").Op("=").Op("*").Id("b") fmt.Printf("%#v", c) // Output: // a = *b } func ExampleOp_variadic() { c := Id("a").Call(Id("b").Op("...")) fmt.Printf("%#v", c) // Output: // a(b...) } func ExampleNewFilePath() { f := NewFilePath("a.b/c") f.Func().Id("init").Params().Block( Qual("a.b/c", "Foo").Call().Comment("Local package - alias is omitted."), Qual("d.e/f", "Bar").Call().Comment("Import is automatically added."), Qual("g.h/f", "Baz").Call().Comment("Colliding package name is automatically renamed."), ) fmt.Printf("%#v", f) // Output: // package c // // import ( // f "d.e/f" // f1 "g.h/f" // ) // // func init() { // Foo() // Local package - alias is omitted. // f.Bar() // Import is automatically added. // f1.Baz() // Colliding package name is automatically renamed. // } } func ExampleStruct_empty() { c := Id("c").Op(":=").Make(Chan().Struct()) fmt.Printf("%#v", c) // Output: // c := make(chan struct{}) } func ExampleStruct() { c := Type().Id("foo").Struct( List(Id("x"), Id("y")).Int(), Id("u").Float32(), ) fmt.Printf("%#v", c) // Output: // type foo struct { // x, y int // u float32 // } } func ExampleDefer() { c := Defer().Id("foo").Call() fmt.Printf("%#v", c) // Output: // defer foo() } func ExampleGoto() { c := Goto().Id("Outer") fmt.Printf("%#v", c) // Output: // goto Outer } func ExampleStatement_Clone_broken() { a := Id("a") c := Block( a.Call(), a.Call(), ) fmt.Printf("%#v", c) // Output: // { // a()() // a()() // } } func ExampleStatement_Clone_fixed() { a := Id("a") c := Block( a.Clone().Call(), a.Clone().Call(), ) fmt.Printf("%#v", c) // Output: // { // a() // a() // } } func ExampleFile_Render() { f := NewFile("a") f.Func().Id("main").Params().Block() buf := &bytes.Buffer{} err := f.Render(buf) if err != nil { fmt.Println(err.Error()) } else { fmt.Println(buf.String()) } // Output: // package a // // func main() {} } func ExampleLit() { c := Id("a").Op(":=").Lit("a") fmt.Printf("%#v", c) // Output: // a := "a" } func ExampleLit_float() { c := Id("a").Op(":=").Lit(1.5) fmt.Printf("%#v", c) // Output: // a := 1.5 } func ExampleLitFunc() { c := Id("a").Op(":=").LitFunc(func() interface{} { return 1 + 1 }) fmt.Printf("%#v", c) // Output: // a := 2 } func ExampleDot() { c := Qual("a.b/c", "Foo").Call().Dot("Bar").Index(Lit(0)).Dot("Baz") fmt.Printf("%#v", c) // Output: // c.Foo().Bar[0].Baz } func ExampleList() { c := List(Id("a"), Err()).Op(":=").Id("b").Call() fmt.Printf("%#v", c) // Output: // a, err := b() } func ExampleQual() { c := Qual("encoding/gob", "NewEncoder").Call() fmt.Printf("%#v", c) // Output: // gob.NewEncoder() } func ExampleQual_file() { f := NewFilePath("a.b/c") f.Func().Id("init").Params().Block( Qual("a.b/c", "Foo").Call().Comment("Local package - name is omitted."), Qual("d.e/f", "Bar").Call().Comment("Import is automatically added."), Qual("g.h/f", "Baz").Call().Comment("Colliding package name is renamed."), ) fmt.Printf("%#v", f) // Output: // package c // // import ( // f "d.e/f" // f1 "g.h/f" // ) // // func init() { // Foo() // Local package - name is omitted. // f.Bar() // Import is automatically added. // f1.Baz() // Colliding package name is renamed. // } } func ExampleQual_local() { f := NewFilePath("a.b/c") f.Func().Id("main").Params().Block( Qual("a.b/c", "D").Call(), ) fmt.Printf("%#v", f) // Output: // package c // // func main() { // D() // } } func ExampleId() { c := If(Id("i").Op("==").Id("j")).Block( Return(Id("i")), ) fmt.Printf("%#v", c) // Output: // if i == j { // return i // } } func ExampleErr() { c := If( Err().Op(":=").Id("foo").Call(), Err().Op("!=").Nil(), ).Block( Return(Err()), ) fmt.Printf("%#v", c) // Output: // if err := foo(); err != nil { // return err // } } func ExampleSwitch() { c := Switch(Id("value").Dot("Kind").Call()).Block( Case(Qual("reflect", "Float32"), Qual("reflect", "Float64")).Block( Return(Lit("float")), ), Case(Qual("reflect", "Bool")).Block( Return(Lit("bool")), ), Case(Qual("reflect", "Uintptr")).Block( Fallthrough(), ), Default().Block( Return(Lit("none")), ), ) fmt.Printf("%#v", c) // Output: // switch value.Kind() { // case reflect.Float32, reflect.Float64: // return "float" // case reflect.Bool: // return "bool" // case reflect.Uintptr: // fallthrough // default: // return "none" // } } func ExampleTag() { c := Type().Id("foo").Struct( Id("A").String().Tag(map[string]string{"json": "a"}), Id("B").Int().Tag(map[string]string{"json": "b", "bar": "baz"}), ) fmt.Printf("%#v", c) // Output: // type foo struct { // A string `json:"a"` // B int `bar:"baz" json:"b"` // } } func ExampleNull_and_nil() { c := Func().Id("foo").Params( nil, Id("s").String(), Null(), Id("i").Int(), ).Block() fmt.Printf("%#v", c) // Output: // func foo(s string, i int) {} } func ExampleNull_index() { c := Id("a").Op(":=").Id("b").Index(Lit(1), Null()) fmt.Printf("%#v", c) // Output: // a := b[1] } func ExampleEmpty() { c := Id("a").Op(":=").Id("b").Index(Lit(1), Empty()) fmt.Printf("%#v", c) // Output: // a := b[1:] } func ExampleBlock_complex() { collection := func(name string, key Code, value Code) *Statement { if key == nil { // slice return Var().Id(name).Index().Add(value) } else { // map return Var().Id(name).Map(key).Add(value) } } c := Func().Id("main").Params().Block( collection("foo", nil, String()), collection("bar", String(), Int()), ) fmt.Printf("%#v", c) // Output: // func main() { // var foo []string // var bar map[string]int // } } func ExampleFunc_declaration() { c := Func().Id("a").Params().Block() fmt.Printf("%#v", c) // Output: // func a() {} } func ExampleFunc_literal() { c := Id("a").Op(":=").Func().Params().Block() fmt.Printf("%#v", c) // Output: // a := func() {} } func ExampleInterface() { c := Type().Id("a").Interface( Id("b").Params().String(), ) fmt.Printf("%#v", c) // Output: // type a interface { // b() string // } } func ExampleInterface_empty() { c := Var().Id("a").Interface() fmt.Printf("%#v", c) // Output: // var a interface{} } func ExampleParens() { c := Id("b").Op(":=").Index().Byte().Parens(Id("s")) fmt.Printf("%#v", c) // Output: // b := []byte(s) } func ExampleParens_order() { c := Id("a").Op("/").Parens(Id("b").Op("+").Id("c")) fmt.Printf("%#v", c) // Output: // a / (b + c) } func ExampleValues() { c := Index().String().Values(Lit("a"), Lit("b")) fmt.Printf("%#v", c) // Output: // []string{"a", "b"} } func ExampleDo() { f := func(name string, isMap bool) *Statement { return Id(name).Op(":=").Do(func(s *Statement) { if isMap { s.Map(String()).String() } else { s.Index().String() } }).Values() } fmt.Printf("%#v\n%#v", f("a", true), f("b", false)) // Output: // a := map[string]string{} // b := []string{} } func ExampleReturn() { c := Return(Id("a"), Id("b")) fmt.Printf("%#v", c) // Output: // return a, b } func ExampleMap() { c := Id("a").Op(":=").Map(String()).String().Values() fmt.Printf("%#v", c) // Output: // a := map[string]string{} } func ExampleDict() { c := Id("a").Op(":=").Map(String()).String().Values(Dict{ Lit("a"): Lit("b"), Lit("c"): Lit("d"), }) fmt.Printf("%#v", c) // Output: // a := map[string]string{ // "a": "b", // "c": "d", // } } func ExampleDict_nil() { c := Id("a").Op(":=").Map(String()).String().Values() fmt.Printf("%#v", c) // Output: // a := map[string]string{} } func ExampleDictFunc() { c := Id("a").Op(":=").Map(String()).String().Values(DictFunc(func(d Dict) { d[Lit("a")] = Lit("b") d[Lit("c")] = Lit("d") })) fmt.Printf("%#v", c) // Output: // a := map[string]string{ // "a": "b", // "c": "d", // } } func ExampleDefs() { c := Const().Defs( Id("a").Op("=").Lit("a"), Id("b").Op("=").Lit("b"), ) fmt.Printf("%#v", c) // Output: // const ( // a = "a" // b = "b" // ) } func ExampleIf() { c := If( Err().Op(":=").Id("a").Call(), Err().Op("!=").Nil(), ).Block( Return(Err()), ) fmt.Printf("%#v", c) // Output: // if err := a(); err != nil { // return err // } } func ExampleId_local() { c := Id("a").Op(":=").Lit(1) fmt.Printf("%#v", c) // Output: // a := 1 } func ExampleId_select() { c := Id("a").Dot("b").Dot("c").Call() fmt.Printf("%#v", c) // Output: // a.b.c() } func ExampleId_remote() { f := NewFile("main") f.Func().Id("main").Params().Block( Qual("fmt", "Println").Call( Lit("Hello, world"), ), ) fmt.Printf("%#v", f) // Output: // package main // // import "fmt" // // func main() { // fmt.Println("Hello, world") // } } func ExampleFor() { c := For( Id("i").Op(":=").Lit(0), Id("i").Op("<").Lit(10), Id("i").Op("++"), ).Block( Qual("fmt", "Println").Call(Id("i")), ) fmt.Printf("%#v", c) // Output: // for i := 0; i < 10; i++ { // fmt.Println(i) // } } func ExampleNewFile() { f := NewFile("main") f.Func().Id("main").Params().Block( Qual("fmt", "Println").Call(Lit("Hello, world")), ) fmt.Printf("%#v", f) // Output: // package main // // import "fmt" // // func main() { // fmt.Println("Hello, world") // } } func ExampleNewFilePathName() { f := NewFilePathName("a.b/c", "main") f.Func().Id("main").Params().Block( Qual("a.b/c", "Foo").Call(), ) fmt.Printf("%#v", f) // Output: // package main // // func main() { // Foo() // } } func ExampleFile_HeaderAndPackageComments() { f := NewFile("c") f.CanonicalPath = "d.e/f" f.HeaderComment("Code generated by...") f.PackageComment("Package c implements...") f.Func().Id("init").Params().Block() fmt.Printf("%#v", f) // Output: // // Code generated by... // // // Package c implements... // package c // import "d.e/f" // // func init() {} } func ExampleFile_Anon() { f := NewFile("c") f.Anon("a") f.Func().Id("init").Params().Block() fmt.Printf("%#v", f) // Output: // package c // // import _ "a" // // func init() {} } func ExampleFile_PackagePrefix() { f := NewFile("a") f.PackagePrefix = "pkg" f.Func().Id("main").Params().Block( Qual("b.c/d", "E").Call(), ) fmt.Printf("%#v", f) // Output: // package a // // import pkg_d "b.c/d" // // func main() { // pkg_d.E() // } }