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() }