...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package decode
15
16 import (
17 "fmt"
18 "io"
19 "os"
20 "path/filepath"
21 "sort"
22 "strings"
23
24 "github.com/go-kivik/kivik/v4/x/fsdb/filesystem"
25 )
26
27 type decoder interface {
28 Decode(io.Reader, interface{}) error
29 }
30
31 var decoders = map[string]decoder{
32 "json": &jsonDecoder{},
33 "yaml": &yamlDecoder{},
34 "yml": &yamlDecoder{},
35 }
36
37 var extensions = func() []string {
38 exts := make([]string, 0, len(decoders))
39 for ext := range decoders {
40 exts = append(exts, ext)
41 }
42 sort.Strings(exts)
43 return exts
44 }()
45
46
47
48 func OpenAny(fs filesystem.Filesystem, base string) (f filesystem.File, ext string, err error) {
49 for ext = range decoders {
50 f, err = fs.Open(base + "." + ext)
51 if err == nil || !os.IsNotExist(err) {
52 return
53 }
54 }
55 return
56 }
57
58
59 func Decode(r io.Reader, ext string, i interface{}) error {
60 ext = strings.TrimPrefix(ext, ".")
61 dec, ok := decoders[ext]
62 if !ok {
63 return fmt.Errorf("No decoder for %s", ext)
64 }
65 return dec.Decode(r, i)
66 }
67
68
69
70 func ExplodeFilename(filename string) (basename, ext string, ok bool) {
71 dotExt := filepath.Ext(filename)
72 basename = strings.TrimSuffix(filename, dotExt)
73 ext = strings.TrimPrefix(dotExt, ".")
74 _, ok = decoders[ext]
75 return basename, ext, ok
76 }
77
78
79 func Extensions() []string {
80 return extensions
81 }
82
View as plain text