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  }