github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/types/csv/index.go (about) 1 package csv 2 3 import ( 4 "bytes" 5 enc "encoding/csv" 6 "io" 7 "strings" 8 9 "github.com/lmorg/murex/lang" 10 "github.com/lmorg/murex/lang/types" 11 "github.com/lmorg/murex/utils" 12 ) 13 14 func readIndex(p *lang.Process, params []string) error { 15 cRecords := make(chan []string, 1) 16 status := make(chan error) 17 18 r := enc.NewReader(p.Stdin) 19 20 v, err := p.Config.Get("csv", "separator", types.String) 21 if err != nil { 22 return err 23 } 24 if len(v.(string)) != 0 { 25 r.Comma = rune(v.(string)[0]) 26 } 27 28 v, err = p.Config.Get("csv", "comment", types.String) 29 if err != nil { 30 return err 31 } 32 if len(v.(string)) != 0 { 33 r.Comment = rune(v.(string)[0]) 34 } 35 36 go func() { 37 for { 38 recs, err := r.Read() 39 switch { 40 case err == io.EOF: 41 close(cRecords) 42 status <- nil 43 return 44 45 case err != nil && strings.HasSuffix(err.Error(), enc.ErrFieldCount.Error()): 46 fallthrough 47 48 case err == nil: 49 cRecords <- recs 50 continue 51 52 default: 53 close(cRecords) 54 status <- err 55 return 56 } 57 58 } 59 }() 60 61 marshaller := func(s []string) []byte { 62 var b []byte 63 buf := bytes.NewBuffer(b) 64 w := enc.NewWriter(buf) 65 w.Comma = r.Comma 66 err := w.Write(s) 67 if err != nil { 68 // this shouldn't ever happen anyway 69 panic(err) 70 } 71 w.Flush() 72 if w.Error() != nil { 73 // this shouldn't ever happen anyway 74 panic(err) 75 } 76 77 return utils.CrLfTrim(buf.Bytes()) 78 } 79 80 go func() { 81 err := lang.IndexTemplateTable(p, params, cRecords, marshaller) 82 status <- err 83 return 84 }() 85 86 return <-status 87 }