From 29baa531948de1a2478a47d04bbab14012dc4c15 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Wed, 28 Oct 2020 12:57:11 +0300 Subject: [PATCH] Writer --- README | 7 +++--- field.go | 24 +++++++++++++++++++++ r.go | 5 ----- w.go | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 field.go create mode 100644 w.go diff --git a/README b/README index 23f1fa3..c9ab1aa 100644 --- 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 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 + +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 . +*/ + +// 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 9a4420d..2b917ae 100644 --- 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 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 + +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 . +*/ + +// 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 +} -- 2.44.0