]> Cypherpunks.ru repositories - gorecfile.git/commitdiff
Writer v0.2.0
authorSergey Matveev <stargrave@stargrave.org>
Wed, 28 Oct 2020 09:57:11 +0000 (12:57 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 28 Oct 2020 09:57:11 +0000 (12:57 +0300)
README
field.go [new file with mode: 0644]
r.go
w.go [new file with mode: 0644]

diff --git a/README b/README
index 23f1fa334fac2b85e98f796861e7615f9f5b6879..c9ab1aa107eea826e0b28be7bc5b990a46914ad7 100644 (file)
--- a/README
+++ b/README
@@ -1,6 +1,7 @@
-GNU recutils'es recfile parser on pure Go. recfiles are human-editable,
-plaintext databases. This library allows you to read records and their
-fields from it. Look for cmd/gorecsel as an example usage.
+GNU recutils'es recfile parser/writer on pure Go.
+recfiles are human-editable, plaintext databases. This library allows
+you to read records and their fields from it. Look for cmd/gorecsel as
+an example usage.
 
 * iterate through the records and their fields
 * ignore comments
diff --git a/field.go b/field.go
new file mode 100644 (file)
index 0000000..887ccdb
--- /dev/null
+++ b/field.go
@@ -0,0 +1,24 @@
+/*
+recfile -- GNU recutils'es recfiles parser on pure Go
+Copyright (C) 2020 Sergey Matveev <stargrave@stargrave.org>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, version 3 of the License.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// GNU recutils'es recfiles parser on pure Go
+package recfile
+
+type Field struct {
+       Name  string
+       Value string
+}
diff --git a/r.go b/r.go
index 9a4420d7b6968f8649c44d9ec3481227adf6896c..2b917ae554c7ca20fc7cf43dfae462440de41063 100644 (file)
--- a/r.go
+++ b/r.go
@@ -38,11 +38,6 @@ func NewReader(r io.Reader) *Reader {
        return &Reader{bufio.NewScanner(r)}
 }
 
-type Field struct {
-       Name  string
-       Value string
-}
-
 // Get next record. Each record is just a collection of fields. io.EOF
 // is returned if there is nothing to read more.
 func (r *Reader) Next() ([]Field, error) {
diff --git a/w.go b/w.go
new file mode 100644 (file)
index 0000000..fd71e18
--- /dev/null
+++ b/w.go
@@ -0,0 +1,65 @@
+/*
+recfile -- GNU recutils'es recfiles parser on pure Go
+Copyright (C) 2020 Sergey Matveev <stargrave@stargrave.org>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, version 3 of the License.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+// GNU recutils'es recfiles parser on pure Go
+package recfile
+
+import (
+       "io"
+       "strings"
+)
+
+type Writer struct {
+       w io.StringWriter
+}
+
+func NewWriter(w io.StringWriter) *Writer {
+       return &Writer{w}
+}
+
+func (w *Writer) RecordStart(fs ...Field) (written int, err error) {
+       return w.w.WriteString("\n")
+}
+
+func (w *Writer) WriteFields(fs ...Field) (written int, err error) {
+       var n int
+       for _, f := range fs {
+               n, err = w.w.WriteString(f.Name + ": " + strings.TrimLeft(f.Value, " ") + "\n")
+               written += n
+               if err != nil {
+                       return
+               }
+       }
+       return
+}
+
+func (w *Writer) WriteFieldMultiline(name string, lines []string) (written int, err error) {
+       var n int
+       n, err = w.w.WriteString(name + ": " + strings.TrimLeft(lines[0], " ") + "\n")
+       written += n
+       if err != nil {
+               return
+       }
+       for _, l := range lines[1:] {
+               n, err = w.w.WriteString("+ " + l + "\n")
+               written += n
+               if err != nil {
+                       return
+               }
+       }
+       return
+}