github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/types/jsonlines/array.go (about) 1 package jsonlines 2 3 import ( 4 "bufio" 5 "bytes" 6 "context" 7 "fmt" 8 9 "github.com/lmorg/murex/lang/stdio" 10 "github.com/lmorg/murex/lang/types" 11 ) 12 13 func readArray(ctx context.Context, read stdio.Io, callback func([]byte)) error { 14 scanner := bufio.NewScanner(read) 15 for scanner.Scan() { 16 select { 17 case <-ctx.Done(): 18 return scanner.Err() 19 20 default: 21 callback(bytes.TrimSpace(scanner.Bytes())) 22 } 23 } 24 25 err := scanner.Err() 26 if err != nil { 27 return fmt.Errorf("error while reading a %s array: %s", types.JsonLines, err.Error()) 28 } 29 return nil 30 } 31 32 func readArrayWithType(ctx context.Context, read stdio.Io, callback func(interface{}, string)) error { 33 scanner := bufio.NewScanner(read) 34 for scanner.Scan() { 35 select { 36 case <-ctx.Done(): 37 return scanner.Err() 38 39 default: 40 callback(bytes.TrimSpace(scanner.Bytes()), types.Json) 41 } 42 } 43 44 err := scanner.Err() 45 if err != nil { 46 return fmt.Errorf("error while reading a %s array: %s", types.JsonLines, err.Error()) 47 } 48 return nil 49 } 50 51 type arrayWriter struct { 52 writer stdio.Io 53 } 54 55 func newArrayWriter(writer stdio.Io) (stdio.ArrayWriter, error) { 56 w := &arrayWriter{writer: writer} 57 return w, nil 58 } 59 60 func (w *arrayWriter) Write(b []byte) (err error) { 61 _, err = w.writer.Writeln(b) 62 return 63 } 64 65 func (w *arrayWriter) WriteString(s string) (err error) { 66 return w.Write([]byte(s)) 67 } 68 69 func (w *arrayWriter) Close() error { 70 return nil 71 }