github.com/anthropics/anthropic-sdk-go@v1.70.1/packages/jsonl/jsonl.go (about) 1 // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. 2 3 package jsonl 4 5 import ( 6 "bufio" 7 "encoding/json" 8 "fmt" 9 "io" 10 "net/http" 11 ) 12 13 type Stream[T any] struct { 14 rc io.ReadCloser 15 scn *bufio.Scanner 16 cur T 17 err error 18 } 19 20 func NewStream[T any](res *http.Response, err error) *Stream[T] { 21 if err != nil { 22 return &Stream[T]{err: err} 23 } 24 25 if res == nil || res.Body == nil { 26 return &Stream[T]{err: fmt.Errorf("No streaming response body")} 27 } 28 29 scn := bufio.NewScanner(res.Body) 30 scn.Buffer(nil, bufio.MaxScanTokenSize<<9) 31 return &Stream[T]{ 32 rc: res.Body, 33 scn: scn, 34 err: err, 35 } 36 } 37 38 func (s *Stream[T]) Next() bool { 39 if s.err != nil { 40 return false 41 } 42 43 if !s.scn.Scan() { 44 if err := s.scn.Err(); err != nil { 45 s.err = err 46 } 47 return false 48 } 49 50 line := s.scn.Bytes() 51 var nxt T 52 s.err = json.Unmarshal(line, &nxt) 53 s.cur = nxt 54 return s.err == nil 55 } 56 57 func (s *Stream[T]) Current() T { 58 return s.cur 59 } 60 61 func (s *Stream[T]) Err() error { 62 return s.err 63 } 64 65 func (s *Stream[T]) Close() error { 66 if s.rc == nil { 67 return nil 68 } 69 return s.rc.Close() 70 }