github.com/go-swagger/go-swagger@v0.31.0/examples/stream-server/elapsed_client.go (about) 1 //go:build ignore 2 // +build ignore 3 4 package main 5 6 import ( 7 "bufio" 8 "context" 9 "encoding/json" 10 "io" 11 "log" 12 "os" 13 "sync" 14 "time" 15 16 "github.com/go-openapi/runtime" 17 httptransport "github.com/go-openapi/runtime/client" 18 "github.com/go-openapi/swag" 19 "github.com/go-swagger/go-swagger/examples/stream-server/client" 20 "github.com/go-swagger/go-swagger/examples/stream-server/client/operations" 21 "github.com/go-swagger/go-swagger/examples/stream-server/models" 22 ) 23 24 func main() { 25 26 n := int64(5) 27 if len(os.Args) > 1 { 28 var err error 29 n, err = swag.ConvertInt64(os.Args[1]) 30 if err != nil { 31 log.Fatalln("pass an integer as argument") 32 return 33 } 34 } 35 log.Printf("asking server for countdown timings: %d", n) 36 37 if err := ask(n); err != nil { 38 log.Printf("failure: %v", err) 39 } 40 } 41 42 func ask(n int64) error { 43 customized := httptransport.New("localhost:8000", "/", []string{"http"}) 44 customized.Consumers[runtime.JSONMime] = runtime.ByteStreamConsumer() 45 46 countdowns := client.New(customized, nil) 47 48 reader, writer := io.Pipe() 49 50 scanner := bufio.NewScanner(reader) 51 52 ctx, cancel := context.WithCancel(context.Background()) 53 54 // consumes asynchronously the response buffer 55 var wg sync.WaitGroup 56 57 wg.Add(1) 58 go func(wg *sync.WaitGroup) { 59 defer wg.Done() 60 defer cancel() 61 62 // read response items line by line 63 for scanner.Scan() { 64 // each response item is JSON 65 txt := scanner.Text() 66 log.Printf("received countdown mark - raw: %s", txt) 67 68 var mark models.Mark 69 70 err := json.Unmarshal([]byte(txt), &mark) 71 if err != nil { 72 log.Printf("unmarshal error: %v", err) 73 return 74 } 75 76 log.Printf("received countdown mark - remaining: %d", swag.Int64Value(mark.Remains)) 77 } 78 79 if err := scanner.Err(); err != nil { 80 log.Printf("scanner err: %v", err) 81 } 82 83 log.Println("EOF") 84 }(&wg) 85 86 queryCtx, timedOut := context.WithTimeout(ctx, 7*time.Second) 87 defer timedOut() 88 89 elapsed := operations.NewElapseParamsWithContext(queryCtx).WithLength(n) 90 91 _, err := countdowns.Operations.Elapse(elapsed, writer) 92 93 if err == nil { 94 log.Printf("response complete") 95 } else { 96 log.Printf("got an error") 97 } 98 99 _ = writer.Close() 100 101 wg.Wait() 102 103 return err 104 }