json/std/factory.go

127 lines
2.1 KiB
Go

package std
import (
"fmt"
"strconv"
"strings"
"go.neonxp.ru/json"
)
func Factory(typ json.NodeType) (json.Node, error) {
switch typ {
case json.ObjectType:
return ObjectNode{}, nil
case json.ArrayType:
return &ArrayNode{}, nil
case json.StringType:
return &StringNode{}, nil
case json.NumberType:
return &NumberNode{}, nil
case json.BooleanType:
return &BooleanNode{}, nil
case json.NullType:
return NullNode{}, nil
}
return nil, fmt.Errorf("unknown type: %s", typ)
}
type ObjectNode map[string]json.Node
func (o ObjectNode) SetKeyValue(k string, v json.Node) {
o[k] = v
}
func (o ObjectNode) GetByKey(k string) (json.Node, bool) {
v, ok := o[k]
return v, ok
}
func (o ObjectNode) String() string {
res := make([]string, 0, len(o))
for k, n := range o {
res = append(res, fmt.Sprintf(`"%s":%s`, k, n.String()))
}
return fmt.Sprintf(`{%s}`, strings.Join(res, ","))
}
type ArrayNode []json.Node
func (o *ArrayNode) Append(v json.Node) {
na := append(*o, v)
*o = na
}
func (o *ArrayNode) Index(i int) json.Node {
return (*o)[i]
}
func (o *ArrayNode) Len() int {
return len(*o)
}
func (o *ArrayNode) String() string {
res := make([]string, 0, len(*o))
for _, v := range *o {
res = append(res, v.String())
}
return fmt.Sprintf(`[%s]`, strings.Join(res, ","))
}
type StringNode struct {
Value string
}
func (o *StringNode) SetString(v string) {
o.Value = v
}
func (o *StringNode) GetString() string {
return o.Value
}
func (o *StringNode) String() string {
return `"` + o.Value + `"`
}
type NumberNode struct {
Value float64
}
func (o *NumberNode) SetNumber(v float64) {
o.Value = v
}
func (o *NumberNode) GetNumber() float64 {
return o.Value
}
func (o *NumberNode) String() string {
return strconv.FormatFloat(float64(o.Value), 'g', 15, 64)
}
type BooleanNode struct {
Value bool
}
func (o *BooleanNode) SetBool(v bool) {
o.Value = v
}
func (o *BooleanNode) GetBool() bool {
return o.Value
}
func (o BooleanNode) String() string {
if o.Value {
return "true"
}
return "false"
}
type NullNode struct{}
func (o NullNode) String() string {
return "null"
}