Skip to content

Commit

Permalink
refactor: refactoring the config drivers build logic
Browse files Browse the repository at this point in the history
  • Loading branch information
inhere committed May 12, 2022
1 parent 6aaf21d commit 4dd95c8
Show file tree
Hide file tree
Showing 12 changed files with 156 additions and 268 deletions.
20 changes: 3 additions & 17 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,19 +68,6 @@ type strMap map[string]string
// This is a default config manager instance
var dc = New("default")

// Driver interface
type Driver interface {
Name() string
GetDecoder() Decoder
GetEncoder() Encoder
}

// Decoder for decode yml,json,toml format content
type Decoder func(blob []byte, v interface{}) (err error)

// Encoder for decode yml,json,toml format content
type Encoder func(v interface{}) (out []byte, err error)

// Config structure definition
type Config struct {
err error
Expand All @@ -103,10 +90,9 @@ type Config struct {
decoders map[string]Decoder
encoders map[string]Encoder

// cache got config data
intCache map[string]int
strCache map[string]string

// cache on got config data
intCache map[string]int
strCache map[string]string
iArrCache map[string]intArr
iMapCache map[string]intMap
sArrCache map[string]strArr
Expand Down
118 changes: 118 additions & 0 deletions driver.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package config

// default json driver(encoder/decoder)
import (
"encoding/json"

"github.com/gookit/goutil/jsonutil"
)

// Driver interface.
// TODO refactor: rename GetDecoder() to Decode(), rename GetEncoder() to Encode()
type Driver interface {
Name() string
GetDecoder() Decoder
GetEncoder() Encoder
}

// Decoder for decode yml,json,toml format content
type Decoder func(blob []byte, v interface{}) (err error)

// Encoder for decode yml,json,toml format content
type Encoder func(v interface{}) (out []byte, err error)

// StdDriver struct
type StdDriver struct {
name string
decoder Decoder
encoder Encoder
}

// NewDriver new std driver instance.
func NewDriver(name string, dec Decoder, enc Encoder) *StdDriver {
return &StdDriver{name: name, decoder: dec, encoder: enc}
}

// Name of driver
func (d *StdDriver) Name() string {
return d.name
}

// Decode of driver
func (d *StdDriver) Decode(blob []byte, v interface{}) (err error) {
return d.decoder(blob, v)
}

// Encode of driver
func (d *StdDriver) Encode(v interface{}) ([]byte, error) {
return d.encoder(v)
}

// GetDecoder of driver
func (d *StdDriver) GetDecoder() Decoder {
return d.decoder
}

// GetEncoder of driver
func (d *StdDriver) GetEncoder() Encoder {
return d.encoder
}

var (
// JSONAllowComments support write comments on json file.
JSONAllowComments = true

// JSONMarshalIndent if not empty, will use json.MarshalIndent for encode data.
JSONMarshalIndent string
)

// JSONDecoder for json decode
var JSONDecoder Decoder = func(data []byte, v interface{}) (err error) {
if JSONAllowComments {
str := jsonutil.StripComments(string(data))
return json.Unmarshal([]byte(str), v)
}

return json.Unmarshal(data, v)
}

// JSONEncoder for json encode
var JSONEncoder Encoder = func(v interface{}) (out []byte, err error) {
if len(JSONMarshalIndent) > 0 {
return json.MarshalIndent(v, "", JSONMarshalIndent)
}
return json.Marshal(v)
}

// JSONDriver instance fot json
var JSONDriver = &jsonDriver{
StdDriver: StdDriver{
name: JSON,
decoder: JSONDecoder,
encoder: JSONEncoder,
},
}

// jsonDriver for json format content
type jsonDriver struct {
StdDriver
// ClearComments before parse JSON string.
ClearComments bool
// MarshalIndent if not empty, will use json.MarshalIndent for encode data.
MarshalIndent string
}

// Name of the driver
func (d *jsonDriver) Name() string {
return d.name
}

// GetDecoder for the driver
func (d *jsonDriver) GetDecoder() Decoder {
return JSONDecoder
}

// GetEncoder for the driver
func (d *jsonDriver) GetEncoder() Encoder {
return JSONEncoder
}
22 changes: 1 addition & 21 deletions hcl/hcl.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,4 @@ var Encoder config.Encoder = func(ptr interface{}) (out []byte, err error) {
}

// Driver instance for hcl
var Driver = &hclDriver{config.Hcl}

// hclDriver for hcl format content
type hclDriver struct {
name string
}

// Name
func (d *hclDriver) Name() string {
return d.name
}

// GetDecoder for hcl
func (d *hclDriver) GetDecoder() config.Decoder {
return Decoder
}

// GetEncoder for hcl
func (d *hclDriver) GetEncoder() config.Encoder {
return Encoder
}
var Driver = config.NewDriver(config.Hcl, Decoder, Encoder)
22 changes: 1 addition & 21 deletions hclv2/hcl_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,24 +38,4 @@ var Encoder config.Encoder = func(ptr interface{}) (out []byte, err error) {
}

// Driver instance for hcl
var Driver = &hclDriver{config.Hcl}

// hclDriver for hcl format content
type hclDriver struct {
name string
}

// Name get
func (d *hclDriver) Name() string {
return d.name
}

// GetDecoder for hcl
func (d *hclDriver) GetDecoder() config.Decoder {
return Decoder
}

// GetEncoder for hcl
func (d *hclDriver) GetEncoder() config.Encoder {
return Encoder
}
var Driver = config.NewDriver(config.Hcl, Decoder, Encoder)
22 changes: 1 addition & 21 deletions ini/ini.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,4 @@ var Encoder config.Encoder = func(ptr interface{}) (out []byte, err error) {
}

// Driver for ini
var Driver = &iniDriver{config.Ini}

// iniDriver for ini format content
type iniDriver struct {
name string
}

// Name get name
func (d *iniDriver) Name() string {
return d.name
}

// GetDecoder for ini
func (d *iniDriver) GetDecoder() config.Decoder {
return Decoder
}

// GetEncoder for ini
func (d *iniDriver) GetEncoder() config.Encoder {
return Encoder
}
var Driver = config.NewDriver(config.Ini, Decoder, Encoder)
46 changes: 13 additions & 33 deletions json/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,38 +9,18 @@ import (

var parser = jsoniter.ConfigCompatibleWithStandardLibrary

// Decoder for json
var Decoder config.Decoder = func(data []byte, v interface{}) (err error) {
if config.JSONAllowComments {
str := jsonutil.StripComments(string(data))
return parser.Unmarshal([]byte(str), v)
var (
// Decoder for json
Decoder config.Decoder = func(data []byte, v interface{}) (err error) {
if config.JSONAllowComments {
str := jsonutil.StripComments(string(data))
return parser.Unmarshal([]byte(str), v)
}
return parser.Unmarshal(data, v)
}

return parser.Unmarshal(data, v)
}

// Encoder for json
var Encoder config.Encoder = parser.Marshal

// Driver for json
var Driver = &jsonDriver{config.JSON}

// jsonDriver for json format content
type jsonDriver struct {
name string
}

// Name get name
func (d *jsonDriver) Name() string {
return d.name
}

// GetDecoder for json
func (d *jsonDriver) GetDecoder() config.Decoder {
return Decoder
}

// GetEncoder for json
func (d *jsonDriver) GetEncoder() config.Encoder {
return Encoder
}
// Encoder for json
Encoder config.Encoder = parser.Marshal
// Driver for json
Driver = config.NewDriver(config.JSON, Decoder, Encoder)
)
34 changes: 12 additions & 22 deletions json5/json5.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,35 +6,25 @@ import (
"github.com/yosuke-furukawa/json5/encoding/json5"
)

// NAME for driver
const NAME = "json5"

// JSONMarshalIndent if not empty, will use json.MarshalIndent for encode data.
var JSONMarshalIndent string

var (
// Decoder for json
Decoder config.Decoder = json5.Unmarshal

// Encoder for json5
Encoder config.Encoder = json5.Marshal
Encoder config.Encoder = func(v interface{}) (out []byte, err error) {
if len(JSONMarshalIndent) == 0 {
return json5.Marshal(v)
}

return json5.MarshalIndent(v, "", JSONMarshalIndent)
}

// Driver for json5
Driver = &json5Driver{name: NAME}
Driver = config.NewDriver(NAME, Decoder, Encoder)
)

// json5Driver for json5 format content
type json5Driver struct {
name string
}

// Name get name
func (d *json5Driver) Name() string {
return d.name
}

// GetDecoder for json5
func (d *json5Driver) GetDecoder() config.Decoder {
return Decoder
}

// GetEncoder for json5
func (d *json5Driver) GetEncoder() config.Encoder {
return Encoder
}
48 changes: 0 additions & 48 deletions json_driver.go

This file was deleted.

0 comments on commit 4dd95c8

Please sign in to comment.