github.com/machinefi/w3bstream@v1.6.5-rc9.0.20240426031326-b8c7c4876e72/pkg/depends/gen/codegen/gen_z_example_test.go (about)

     1  package codegen_test
     2  
     3  import (
     4  	"fmt"
     5  	"go/token"
     6  	"reflect"
     7  	"runtime"
     8  
     9  	. "github.com/machinefi/w3bstream/pkg/depends/gen/codegen"
    10  )
    11  
    12  func ExampleVar() {
    13  	var v = Var(String, "a")
    14  
    15  	fmt.Println(string(v.Bytes()))
    16  	fmt.Println(string(v.WithComments("A is a string").Bytes()))
    17  
    18  	v = v.WithTag(`json:"a"`)
    19  	fmt.Println(string(v.Bytes()))
    20  
    21  	v = v.WithoutTag()
    22  	fmt.Println(string(v.Bytes()))
    23  
    24  	v = Var(String, "AliasStringType").AsAlias().
    25  		WithComments("AliasStringType is a Alias of string")
    26  	fmt.Println(string(v.Bytes()))
    27  
    28  	// Output:
    29  	// a string
    30  	// // A is a string
    31  	// a string
    32  	// a string `json:"a"`
    33  	// a string
    34  	// // AliasStringType is a Alias of string
    35  	// AliasStringType = string
    36  }
    37  
    38  func ExampleType() {
    39  
    40  	var t = Type("Name")
    41  
    42  	fmt.Println(string(t.Bytes()))
    43  	fmt.Println(string(Chan(t).Bytes()))
    44  	fmt.Println(string(Chan(Star(t)).Bytes()))
    45  	fmt.Println(string(Array(t, 10).Bytes()))
    46  	fmt.Println(string(Array(Star(t), 10).Bytes()))
    47  	fmt.Println(string(Slice(t).Bytes()))
    48  	fmt.Println(string(Map(Bool, Star(t)).Bytes()))
    49  
    50  	// Output:
    51  	// Name
    52  	// chan Name
    53  	// chan *Name
    54  	// [10]Name
    55  	// [10]*Name
    56  	// []Name
    57  	// map[bool]*Name
    58  }
    59  
    60  func ExampleTypeAssert() {
    61  
    62  	ta := TypeAssert(String, Ident("value"))
    63  	fmt.Println(string(ta.Bytes()))
    64  
    65  	ta = TypeAssert(Type("Name"), Ident("value"))
    66  	fmt.Println(string(ta.Bytes()))
    67  
    68  	ta = TypeAssert(Star(Type("Name")), Ident("value"))
    69  	fmt.Println(string(ta.Bytes()))
    70  
    71  	// Output:
    72  	// value.(string)
    73  	// value.(Name)
    74  	// value.(*Name)
    75  }
    76  
    77  func ExampleIdent() {
    78  	ids := Idents("a", "b", "C", "Type.Field")
    79  	for _, id := range ids {
    80  		fmt.Println(string(id.Bytes()))
    81  	}
    82  
    83  	// Output:
    84  	// a
    85  	// b
    86  	// C
    87  	// Type.Field
    88  }
    89  
    90  func ExampleDefine() {
    91  	fmt.Println(Stringify(
    92  		Define(
    93  			Ident("a"),
    94  			Ident("b"),
    95  		).By(
    96  			Ident("c"),
    97  			Call("Fn", Valuer(1)),
    98  		)),
    99  	)
   100  
   101  	fmt.Println(Stringify(
   102  		Define(
   103  			Ident("a"),
   104  			Ident("b"),
   105  		).By(
   106  			Ident("c"),
   107  			Call("Fn", Valuer("abc")),
   108  		)),
   109  	)
   110  
   111  	fmt.Println(Stringify(
   112  		DeclVar(
   113  			Var(Int, "a"),
   114  			Assign(Var(String, "a", "b")).By(Call("Fn", Valuer(1))),
   115  		),
   116  	))
   117  
   118  	fmt.Println(Stringify(
   119  		DeclConst(
   120  			Assign(Var(Int, "a")).By(Iota),
   121  			Assign(Ident("b")),
   122  			Assign(Ident("c")),
   123  		),
   124  	))
   125  
   126  	fmt.Println(Stringify(
   127  		DeclType(
   128  			Var(Type("time.Time"), "aliasTime").AsAlias(),
   129  		),
   130  	))
   131  
   132  	// Output:
   133  	// a, b := c, Fn(1)
   134  	// a, b := c, Fn("abc")
   135  	// var (
   136  	// a int
   137  	// a, b string = Fn(1)
   138  	// )
   139  	// const (
   140  	// a int = iota
   141  	// b
   142  	// c
   143  	// )
   144  	// type aliasTime = time.Time
   145  }
   146  
   147  func ExampleFor() {
   148  	i := Ident("i")
   149  	fmt.Println(
   150  		Stringify(
   151  			For(
   152  				Define(i).By(Valuer(0)),
   153  				AssignWith(token.LSS, i).By(Valuer(10)),
   154  				Inc(i),
   155  			).Do(),
   156  		),
   157  	)
   158  
   159  	// Output:
   160  	// for i := 0; i < 10; i++ {
   161  	// }
   162  }
   163  
   164  func ExampleForRange() {
   165  	k, v, ranger := Ident("k"), Ident("v"), Ident("ranger")
   166  	fmt.Println(
   167  		Stringify(
   168  			ForRange(ranger, k, v).Do(),
   169  		),
   170  	)
   171  
   172  	// Output:
   173  	// for k, v := range ranger {
   174  	// }
   175  }
   176  
   177  var clauses []*SnippetCaseClause
   178  
   179  func ExampleCaseClause() {
   180  	clauses = append(clauses,
   181  		CaseClause(Valuer(1), Valuer(2)),
   182  		CaseClause(Arrow(Ref(Ident("time"), Call("After")))),
   183  		CaseClause().Do(Return(Ident("a"), Call("Fn", Valuer(1)))),
   184  	)
   185  
   186  	for _, c := range clauses {
   187  		fmt.Println(Stringify(c))
   188  	}
   189  
   190  	// Output:
   191  	// case 1, 2:
   192  	// case <-time.After():
   193  	// default:
   194  	// return a, Fn(1)
   195  }
   196  
   197  func ExampleSwitch() {
   198  	fmt.Println(Stringify(Switch(nil).When(clauses...)))
   199  
   200  	os := Ident("os")
   201  	tar := Ident("tar")
   202  	_ = runtime.GOOS
   203  	fmt.Print(Stringify(
   204  		Switch(os).
   205  			InitWith(Define(os).By(Ref(Ident("runtime"), Ident("GOOS")))).
   206  			When(
   207  				CaseClause(Valuer("darwin")).Do(
   208  					Assign(tar).By(Ident("OS_DARWIN")),
   209  				),
   210  				CaseClause(Valuer("linux")).Do(
   211  					Assign(tar).By(Ident("OS_LINUX")),
   212  				),
   213  				CaseClause(Valuer("windows")).Do(
   214  					Assign(tar).By(Ident("OS_WINDOWS")),
   215  				),
   216  				CaseClause().Do(
   217  					Assign(tar).By(Ident("OS_UNKNOWN")),
   218  				),
   219  				CaseClause(Valuer("doNothing")),
   220  			),
   221  	))
   222  
   223  	// Output:
   224  	// switch {
   225  	// case 1, 2:
   226  	// case <-time.After():
   227  	// default:
   228  	// return a, Fn(1)
   229  	// }
   230  	// switch os := runtime.GOOS; os {
   231  	// case "darwin":
   232  	// tar = OS_DARWIN
   233  	// case "linux":
   234  	// tar = OS_LINUX
   235  	// case "windows":
   236  	// tar = OS_WINDOWS
   237  	// default:
   238  	// tar = OS_UNKNOWN
   239  	// case "doNothing":
   240  	// }
   241  }
   242  
   243  func ExampleSelect() {
   244  	ch1, ch2 := "ch1", "ch2"
   245  
   246  	fmt.Println(Stringify(DeclVar(
   247  		Assign(Var(nil, ch1)).By(CallMakeChan(Int, 10)),
   248  		Assign(Var(nil, ch2)).By(CallMakeChan(String, 10)),
   249  		Var(String, "ret"),
   250  	)))
   251  	fmt.Println(Stringify(
   252  		Select(
   253  			CaseClause(Define(Ident("i")).By(Arrow(Ident(ch1)))).Do(
   254  				Assign(Ident("ret")).By(
   255  					Ref(Ident("fmt"), Call("Sprintf", Ident("i")))),
   256  			),
   257  			CaseClause(Define(Ident("s")).By(Arrow(Ident(ch2)))).Do(
   258  				Assign(Ident("ret")).By(Ident("s")),
   259  			),
   260  			CaseClause().Do(),
   261  		),
   262  	))
   263  	fmt.Println(Stringify(Return(Ident("ret"))))
   264  
   265  	// Output:
   266  	// var (
   267  	// ch1 = make(chan int, 10)
   268  	// ch2 = make(chan string, 10)
   269  	// ret string
   270  	// )
   271  	// select {
   272  	// case i := <-ch1:
   273  	// ret = fmt.Sprintf(i)
   274  	// case s := <-ch2:
   275  	// ret = s
   276  	// default:
   277  	// }
   278  	// return ret
   279  
   280  }
   281  
   282  func ExampleStar() {
   283  	fmt.Println(Stringify(Star(Int)))
   284  
   285  	// Output:
   286  	// *int
   287  }
   288  
   289  func ExampleAddr() {
   290  	fmt.Println(Stringify(Addr(Ident("i"))))
   291  
   292  	// Output:
   293  	// &i
   294  }
   295  
   296  func ExampleParen() {
   297  	fmt.Println(Stringify(Paren(Valuer(1))))
   298  
   299  	// Output:
   300  	// (1)
   301  }
   302  
   303  func ExampleArrow() {
   304  	fmt.Println(Stringify(Arrow(Ident("ch"))))
   305  	fmt.Println(Stringify(Define(Ident("val")).By(Arrow(Ident("ch")))))
   306  
   307  	// Output:
   308  	// <-ch
   309  	// val := <-ch
   310  }
   311  
   312  func ExampleCasting() {
   313  	fmt.Println(Stringify(DeclVar(
   314  		Assign(Ident("a")).By(Casting(Float64, Valuer(0.1))),
   315  		Assign(Ident("b")).By(Casting(Float32, Ident("a"))),
   316  	)))
   317  
   318  	// Output:
   319  	// var (
   320  	// a = float64(0.1)
   321  	// b = float32(a)
   322  	// )
   323  }
   324  
   325  func ExampleCall() {
   326  	fmt.Println(Stringify(Call("NewBuffer", Nil)))
   327  
   328  	// Output:
   329  	// NewBuffer(nil)
   330  }
   331  
   332  func ExampleCallWith() {
   333  	fmt.Println(Stringify(Ref(Ident("bytes"), CallWith(Ident("NewBuffer"), Nil))))
   334  
   335  	// Output:
   336  	// bytes.NewBuffer(nil)
   337  }
   338  
   339  func ExampleComments() {
   340  	fmt.Println(Stringify(DeclVar(
   341  		Var(Int, "a").WithOneLineComment("this is a int var"),
   342  	)))
   343  
   344  	// Output:
   345  	// var a int // this is a int var
   346  }
   347  
   348  func ExampleKeyValue() {
   349  	fmt.Println(string(KeyValue(Valuer("key"), Valuer("value")).Bytes()))
   350  
   351  	// Output:
   352  	// "key": "value"
   353  }
   354  
   355  func ExampleInc() {
   356  	fmt.Println(string(Inc(Ident("i")).Bytes()))
   357  
   358  	// Output:
   359  	// i++
   360  }
   361  
   362  func ExampleDec() {
   363  	fmt.Println(string(Dec(Ident("i")).Bytes()))
   364  
   365  	// Output:
   366  	// i--
   367  }
   368  
   369  func ExampleAccess() {
   370  	output(Access(Ident("array"), 10))
   371  	output(AccessWith(Ident("array"), Exprer("?-?", Call("len", Ident("array")), Valuer(1))))
   372  	output(AccessWith(Ident("array"), Exprer("len(array)-1")))
   373  
   374  	// Output:
   375  	// array[10]
   376  	// array[len(array)-1]
   377  	// array[len(array)-1]
   378  }
   379  
   380  type Anonymous interface{}
   381  
   382  type Exported struct {
   383  	F_int        int
   384  	f_unexported interface{}
   385  	F_map        map[string]struct{}
   386  	F_slice      []int
   387  	Anonymous
   388  }
   389  
   390  func ExampleTyper() {
   391  	t := reflect.TypeOf(&Exported{})
   392  	output(Typer(t))
   393  	t = reflect.TypeOf(Snippet(SnippetBuiltIn("")))
   394  	output(Typer(t))
   395  
   396  	// Output:
   397  	// *codegen_test.Exported
   398  	// codegen.SnippetBuiltIn
   399  }
   400  
   401  func ExampleValuer() {
   402  	type unexported Exported
   403  	output(Valuer(1))
   404  	newline()
   405  	output(Valuer(unexported{
   406  		F_int:        1,
   407  		f_unexported: 2,
   408  		F_map:        map[string]struct{}{"a": {}},
   409  		F_slice:      []int{1, 2, 3},
   410  		Anonymous:    3,
   411  	}))
   412  	newline()
   413  	output(Valuer(&Exported{
   414  		F_map:     map[string]struct{}{"a": {}},
   415  		F_slice:   []int{1, 2, 3},
   416  		Anonymous: 3,
   417  	}))
   418  
   419  	// Output:
   420  	// 1
   421  	//
   422  	// codegen_test.unexported{
   423  	// F_int: 1,
   424  	// F_map: map[string]struct {
   425  	// }{
   426  	// "a": struct {
   427  	// }{
   428  	// },
   429  	// },
   430  	// F_slice: []int{
   431  	// 1,
   432  	// 2,
   433  	// 3,
   434  	// },
   435  	// Anonymous: 3,
   436  	// }
   437  	//
   438  	// &(codegen_test.Exported{
   439  	// F_map: map[string]struct {
   440  	// }{
   441  	// "a": struct {
   442  	// }{
   443  	// },
   444  	// },
   445  	// F_slice: []int{
   446  	// 1,
   447  	// 2,
   448  	// 3,
   449  	// },
   450  	// Anonymous: 3,
   451  	// })
   452  }
   453  
   454  func ExampleNewFile() {
   455  	filename := "examples/hello/hello.go"
   456  	f := NewFile("main", filename)
   457  
   458  	f.WriteSnippet(
   459  		DeclVar(Var(Slice(String), "lines")),
   460  
   461  		Func().Named("main").Do(
   462  			DeclVar(
   463  				Assign(Var(nil, "ch")).By(Call("make", String, Valuer(10))),
   464  			),
   465  
   466  			Call("close", Ident("ch")).AsDefer(),
   467  
   468  			Call("PipeReadAndPrint", Ident("ch")).AsRoutine(),
   469  
   470  			Call("PipePrintAndWrite", Ident("ch"), Ident("lines")),
   471  		),
   472  
   473  		Func(Var(ChanRO(String), "ch"), Var(Ellipsis(String), "v")).
   474  			Named("PipePrintAndWrite").
   475  			Do(
   476  				ForRange(Ident("v"), Ident("i"), Ident("_")).Do(
   477  					Call(f.Use("fmt", "Println"), AccessWith(Ident("v"), Ident("i"))),
   478  					Exprer("? <- ?", Ident("ch"), AccessWith(Ident("v"), Ident("i"))),
   479  				),
   480  			),
   481  
   482  		Func(Var(ChanRO(String), "ch")).Named("PipeReadAndPrint").Do(
   483  			For(nil, nil, nil).Do(
   484  				Select(
   485  					CaseClause(Define(Ident("s"), Ident("ok")).By(Arrow(Ident("ch")))).Do(
   486  						If(Ident("ok")).Do(
   487  							Call(f.Use("fmt", "Println"), Ident("s")),
   488  						).Else(
   489  							If(Exprer("!ok")).Do(
   490  								Return(),
   491  							),
   492  						),
   493  					),
   494  				),
   495  			),
   496  		),
   497  	)
   498  
   499  	fmt.Println(string(f.Formatted()))
   500  
   501  	// Output:
   502  	// // This is a generated source file. DO NOT EDIT
   503  	// // Source: main/hello.go
   504  	//
   505  	// package main
   506  	//
   507  	// import "fmt"
   508  	//
   509  	// var lines []string
   510  	//
   511  	// func main() {
   512  	// 	var ch = make(string, 10)
   513  	// 	defer close(ch)
   514  	// 	go PipeReadAndPrint(ch)
   515  	// 	PipePrintAndWrite(ch, lines)
   516  	// }
   517  	//
   518  	// func PipePrintAndWrite(ch <-chan string, v ...string) {
   519  	// 	for i := range v {
   520  	// 		fmt.Println(v[i])
   521  	// 		ch <- v[i]
   522  	// 	}
   523  	// }
   524  	//
   525  	// func PipeReadAndPrint(ch <-chan string) {
   526  	// 	for {
   527  	// 		select {
   528  	// 		case s, ok := <-ch:
   529  	// 			if ok {
   530  	// 				fmt.Println(s)
   531  	// 			} else if !ok {
   532  	// 				return
   533  	// 			}
   534  	// 		}
   535  	// 	}
   536  	// }
   537  }
   538  
   539  func output(s Snippet) { fmt.Println(string(s.Bytes())) }
   540  func newline()         { fmt.Println() }