1
0
mirror of https://github.com/TomWright/dasel.git synced 2022-05-22 02:32:45 +03:00
Files
dasel-data-selector/internal/storage/parser.go
2020-09-22 15:06:37 +01:00

58 lines
1.3 KiB
Go

package storage
import (
"fmt"
"io/ioutil"
"path/filepath"
"strings"
)
// UnknownParserErr is returned when an invalid parser name is given.
type UnknownParserErr struct {
parser string
}
// Error returns the error message.
func (e UnknownParserErr) Error() string {
return fmt.Sprintf("unknown parser: %s", e.parser)
}
// Parser can be used to load and save files from/to disk.
type Parser interface {
FromBytes(byteData []byte) (interface{}, error)
}
// NewParserFromFilename returns a Parser from the given filename.
func NewParserFromFilename(filename string) (Parser, error) {
ext := strings.ToLower(filepath.Ext(filename))
switch ext {
case ".yaml", ".yml":
return &YAMLParser{}, nil
case ".json":
return &JSONParser{}, nil
default:
return nil, &UnknownParserErr{parser: ext}
}
}
// NewParserFromString returns a Parser from the given parser name.
func NewParserFromString(parser string) (Parser, error) {
switch parser {
case "yaml":
return &YAMLParser{}, nil
case "json":
return &JSONParser{}, nil
default:
return nil, &UnknownParserErr{parser: parser}
}
}
// LoadFromFile loads data from the given file.
func LoadFromFile(filename string, p Parser) (interface{}, error) {
byteData, err := ioutil.ReadFile(filename)
if err != nil {
return nil, fmt.Errorf("could not read config file: %w", err)
}
return p.FromBytes(byteData)
}