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  }