aboutsummaryrefslogtreecommitdiffstats
path: root/formats/config/encoder.go
diff options
context:
space:
mode:
authorSantiago M. Mola <santi@mola.io>2016-11-03 17:10:43 +0100
committerMáximo Cuadros <mcuadros@gmail.com>2016-11-03 17:10:43 +0100
commit3f7fbc6c49e50eb22e3de8a5143817fa7c0c54dd (patch)
tree0bf81a6dd858278000d1d7f7afc578d993fba791 /formats/config/encoder.go
parent94f5e9c949963893d1c3d3e987a591ee15265327 (diff)
downloadgo-git-3f7fbc6c49e50eb22e3de8a5143817fa7c0c54dd.tar.gz
storage/filesystem: implement missing functionality. (#110)
* storage/filesystem: added ObjectStorage Set. * storage/filesystem: now passes all tests, except those specific to transactions. * formats/config: Encoder now encodes subsections with no options. * formats/config: add HasSubsection on Section. * dotgit: add Ref method to get specific reference.
Diffstat (limited to 'formats/config/encoder.go')
-rw-r--r--formats/config/encoder.go65
1 files changed, 51 insertions, 14 deletions
diff --git a/formats/config/encoder.go b/formats/config/encoder.go
index 4a68e44..88bdf65 100644
--- a/formats/config/encoder.go
+++ b/formats/config/encoder.go
@@ -7,7 +7,7 @@ import (
// An Encoder writes config files to an output stream.
type Encoder struct {
- io.Writer
+ w io.Writer
}
// NewEncoder returns a new encoder that writes to w.
@@ -18,21 +18,58 @@ func NewEncoder(w io.Writer) *Encoder {
// Encode writes the config in git config format to the stream of the encoder.
func (e *Encoder) Encode(cfg *Config) error {
for _, s := range cfg.Sections {
- if len(s.Options) > 0 {
- fmt.Fprintf(e, "[%s]\n", s.Name)
- for _, o := range s.Options {
- fmt.Fprintf(e, "\t%s = %s\n", o.Key, o.Value)
- }
+ if err := e.encodeSection(s); err != nil {
+ return err
}
- for _, ss := range s.Subsections {
- if len(ss.Options) > 0 {
- //TODO: escape
- fmt.Fprintf(e, "[%s \"%s\"]\n", s.Name, ss.Name)
- for _, o := range ss.Options {
- fmt.Fprintf(e, "\t%s = %s\n", o.Key, o.Value)
- }
- }
+ }
+
+ return nil
+}
+
+func (e *Encoder) encodeSection(s *Section) error {
+ if len(s.Options) > 0 {
+ if err := e.printf("[%s]\n", s.Name); err != nil {
+ return err
+ }
+
+ if err := e.encodeOptions(s.Options); err != nil {
+ return err
+ }
+ }
+
+ for _, ss := range s.Subsections {
+ if err := e.encodeSubsection(s.Name, ss); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+func (e *Encoder) encodeSubsection(sectionName string, s *Subsection) error {
+ //TODO: escape
+ if err := e.printf("[%s \"%s\"]\n", sectionName, s.Name); err != nil {
+ return err
+ }
+
+ if err := e.encodeOptions(s.Options); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (e *Encoder) encodeOptions(opts Options) error {
+ for _, o := range opts {
+ if err := e.printf("\t%s = %s\n", o.Key, o.Value); err != nil {
+ return err
}
}
+
return nil
}
+
+func (e *Encoder) printf(msg string, args ...interface{}) error {
+ _, err := fmt.Fprintf(e.w, msg, args...)
+ return err
+}