From 19446235e0874948e88769e7bdcd30d95585e8bc Mon Sep 17 00:00:00 2001 From: Leon Mika Date: Mon, 24 Apr 2023 01:29:54 +0000 Subject: [PATCH] Initial commit --- csv.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ fmt.go | 19 +++++++++++++++++++ go.mod | 3 +++ scriptx.go | 22 ++++++++++++++++++++++ subpipe.go | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 126 insertions(+) create mode 100644 csv.go create mode 100644 fmt.go create mode 100644 go.mod create mode 100644 scriptx.go create mode 100644 subpipe.go diff --git a/csv.go b/csv.go new file mode 100644 index 0000000..072dcde --- /dev/null +++ b/csv.go @@ -0,0 +1,49 @@ +package scriptx + +import ( + "encoding/csv" + "errors" + "io" +) + +func CSVColumn(name string) func(r io.Reader, w io.Writer) error { + return func(r io.Reader, w io.Writer) error { + cr := csv.NewReader(r) + + header, err := cr.Read() + if err != nil { + return err + } + + var colIdx = -1 + for i, ch := range header { + if ch == name { + colIdx = i + } + } + if colIdx == -1 { + return nil + } + + for { + rec, err := cr.Read() + if err != nil { + if errors.Is(err, io.EOF) { + return nil + } else { + return err + } + } + if len(rec) < colIdx { + continue + } + + if _, err := io.WriteString(w, rec[colIdx]); err != nil { + return err + } + if _, err := w.Write([]byte{'\n'}); err != nil { + return err + } + } + } +} \ No newline at end of file diff --git a/fmt.go b/fmt.go new file mode 100644 index 0000000..897a91a --- /dev/null +++ b/fmt.go @@ -0,0 +1,19 @@ +package scriptx + +import ( + "fmt" + "io" +) + +func Printf(ptrn string) func(r io.Reader, w io.Writer) error { + return func(r io.Reader, w io.Writer) error { + return eachLine(r, func(line string) error { + _, err := io.WriteString(w, fmt.Sprintf(ptrn, line)) + if err != nil { + return err + } + _, err = w.Write([]byte{'\n'}) + return err + }) + } +} \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..cf027b6 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/lmika/scriptx + +go 1.20 diff --git a/scriptx.go b/scriptx.go new file mode 100644 index 0000000..9c2fc9a --- /dev/null +++ b/scriptx.go @@ -0,0 +1,22 @@ +package scriptx + +import ( + "encoding/json" + "io" +) + +func ToJSON(fn func(line string) any) func(r io.Reader, w io.Writer) error { + return func(r io.Reader, w io.Writer) error { + return eachLine(r, func(line string) (err error) { + jsonBytes, err := json.Marshal(fn(line)) + if err != nil { + return err + } + if _, err = w.Write(jsonBytes); err != nil { + return err + } + _, err = w.Write([]byte{'\n'}) + return err + }) + } +} \ No newline at end of file diff --git a/subpipe.go b/subpipe.go new file mode 100644 index 0000000..738e02e --- /dev/null +++ b/subpipe.go @@ -0,0 +1,33 @@ +package scriptx + +import ( + "bufio" + "github.com/bitfield/script" + "io" +) + +func eachLine(r io.Reader, fn func(line string) error) error { + scanner := bufio.NewScanner(r) + for scanner.Scan() { + if err := fn(scanner.Text()); err != nil { + return err + } + } + return scanner.Err() +} + +func SubPipe(fn func(src string) *script.Pipe) func(r io.Reader, w io.Writer) error { + return func(r io.Reader, w io.Writer) error { + scanner := bufio.NewScanner(r) + for scanner.Scan() { + bts, err := fn(scanner.Text()).Bytes() + if err != nil { + return err + } + if _, err := w.Write(bts); err != nil { + return err + } + } + return scanner.Err() + } +} \ No newline at end of file