-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathencoder.go
79 lines (67 loc) · 1.46 KB
/
encoder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Encoding a Document
//
// buf := bytes.NewBufferString("")
//
// encoder := NewEncoder(buf, doc)
// err := encoder.Encode()
// if err != nil {
// panic(err)
// }
//
// If you need the GEDCOM data as a string you can simply using fmt.Stringer:
//
// data := document.String()
//
package gedcom
import (
"io"
)
// Encoder represents a GEDCOM encoder.
type Encoder struct {
w io.Writer
document *Document
startIndent int
}
// Create a new encoder to generate GEDCOM data.
func NewEncoder(w io.Writer, document *Document) *Encoder {
return &Encoder{
w: w,
document: document,
}
}
func (enc *Encoder) renderNode(indent int, node Node) error {
gedcomLine := node.GEDCOMLine(indent) + "\n"
_, err := enc.w.Write([]byte(gedcomLine))
if err != nil {
return err
}
for _, child := range node.Nodes() {
nextIndent := indent + 1
if indent == NoIndent {
nextIndent = NoIndent
}
err = enc.renderNode(nextIndent, child)
if err != nil {
return err
}
}
return nil
}
// Encode will write the GEDCOM document to the Writer.
func (enc *Encoder) Encode() (err error) {
err = enc.restoreOptionalBOM()
for _, node := range enc.document.Nodes() {
err = enc.renderNode(enc.startIndent, node)
if err != nil {
return
}
}
return
}
// See Decoder.consumeOptionalBOM for more information.
func (enc *Encoder) restoreOptionalBOM() (err error) {
if enc.document.HasBOM {
_, err = enc.w.Write(byteOrderMark)
}
return
}