datasource/etcd/state/parser/parser.go (75 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package parser
import (
"encoding/json"
"errors"
"github.com/go-chassis/foundation/stringutil"
)
var (
ErrParseNilPoint = errors.New("parse nil point")
ErrTargetNilPoint = errors.New("target is nil point")
newBytes CreateValueFunc = func() interface{} { return []byte(nil) }
newString CreateValueFunc = func() interface{} { return "" }
newMap CreateValueFunc = func() interface{} { return make(map[string]string) }
BytesParser = New(newBytes, UnParse)
StringParser = New(newString, TextUnmarshal)
MapParser = New(newMap, MapUnmarshal)
UnParse ParseValueFunc = func(src []byte, dist interface{}) error {
if dist == nil {
return ErrTargetNilPoint
}
d := dist.(*interface{})
*d = src
return nil
}
TextUnmarshal ParseValueFunc = func(src []byte, dist interface{}) error {
if dist == nil {
return ErrTargetNilPoint
}
d := dist.(*interface{})
*d = stringutil.Bytes2str(src)
return nil
}
MapUnmarshal ParseValueFunc = func(src []byte, dist interface{}) error {
if err := check(src, dist); err != nil {
return err
}
d := dist.(*interface{})
m := (*d).(map[string]string)
return json.Unmarshal(src, &m)
}
JSONUnmarshal ParseValueFunc = func(src []byte, dist interface{}) error {
if err := check(src, dist); err != nil {
return err
}
d := dist.(*interface{})
return json.Unmarshal(src, *d)
}
)
// CreateValueFunc the construct func of value object
type CreateValueFunc func() interface{}
// ParseValueFunc the func to parse src to dist object
type ParseValueFunc func(src []byte, dist interface{}) error
type Parser interface {
Unmarshal(src []byte) (interface{}, error)
}
type CommonParser struct {
NewFunc CreateValueFunc
FromFunc ParseValueFunc
}
func (p *CommonParser) Unmarshal(src []byte) (interface{}, error) {
v := p.NewFunc()
if err := p.FromFunc(src, &v); err != nil {
return nil, err
}
return v, nil
}
func check(src []byte, dist interface{}) error {
if src == nil {
return ErrParseNilPoint
}
if dist == nil {
return ErrTargetNilPoint
}
return nil
}
func New(valueFunc CreateValueFunc, parseValueFunc ParseValueFunc) Parser {
return &CommonParser{NewFunc: valueFunc, FromFunc: parseValueFunc}
}