ast

package
v1.3.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 10, 2022 License: Apache-2.0 Imports: 12 Imported by: 0

Documentation

Index

Constants

View Source
const (
	V_NONE   = 0
	V_ERROR  = 1
	V_NULL   = 2
	V_TRUE   = 3
	V_FALSE  = 4
	V_ARRAY  = 5
	V_OBJECT = 6
	V_STRING = 7
	V_NUMBER = int(_V_NUMBER)
	V_ANY    = int(_V_ANY)
)

Variables

View Source
var (
	ErrNotExist      error = newError(_ERR_NOT_FOUND, "value not exists")
	ErrUnsupportType error = newError(_ERR_UNSUPPORT_TYPE, "unsupported type")
)

Functions

func Loads

func Loads(src string) (int, interface{}, error)

Loads parse all json into interface{}

func LoadsUseNumber

func LoadsUseNumber(src string) (int, interface{}, error)

LoadsUseNumber parse all json into interface{}, with numeric nodes casted to json.Number

Types

type Iterator

type Iterator struct {
	// contains filtered or unexported fields
}

func (*Iterator) HasNext

func (self *Iterator) HasNext() bool

HasNext reports if it is the end of iteration or has error.

func (*Iterator) Len

func (self *Iterator) Len() int

func (*Iterator) Pos

func (self *Iterator) Pos() int

type ListIterator

type ListIterator struct {
	Iterator
}

ListIterator is specialized iterator for V_ARRAY

func (*ListIterator) Next

func (self *ListIterator) Next(v *Node) bool

Next scans through children of underlying V_ARRAY, copies each child to v, and returns .HasNext().

type Node

type Node struct {
	// contains filtered or unexported fields
}

func NewAny

func NewAny(any interface{}) Node

NewAny creates a node of type V_ANY if any's type isn't Node or *Node, which stores interface{} and can be only used for `.Interface()`\`.MarshalJSON()`.

func NewArray

func NewArray(v []Node) Node

NewArray creates a node of type V_ARRAY, using v as its underlying children

func NewBool

func NewBool(v bool) Node

NewBool creates a node of type bool:

If v is true, returns V_TRUE node
If v is false, returns V_FALSE node

func NewBytes

func NewBytes(src []byte) Node

NewBytes encodes given src with Base64 (RFC 4648), and creates a node of type V_STRING.

func NewNull

func NewNull() Node

NewNull creates a node of type V_NULL

func NewNumber

func NewNumber(v string) Node

NewNumber creates a json.Number node v must be a decimal string complying with RFC8259

func NewObject

func NewObject(v []Pair) Node

NewObject creates a node of type V_OBJECT, using v as its underlying children

func NewRaw

func NewRaw(json string) Node

NewRaw creates a node of raw json, and decides its type by first char.

func NewString

func NewString(v string) Node

NewString creates a node of type V_STRING. v is considered to be a valid UTF-8 string, which means it won't be validated and unescaped. when the node is encoded to json, v will be escaped.

func (*Node) Add

func (self *Node) Add(node Node) error

Add appends the given node under self.

If self is V_NONE or V_NULL, it becomes V_ARRAY and sets the node at index 0.

func (*Node) AddAny

func (self *Node) AddAny(val interface{}) error

SetAny wraps val with V_ANY node, and Add() the node.

func (*Node) Array

func (self *Node) Array() ([]interface{}, error)

Array loads all indexes of an array node

func (*Node) ArrayUseNode

func (self *Node) ArrayUseNode() ([]Node, error)

ArrayUseNode copys both parsed and non-parsed chidren nodes, and indexes them by original order

func (*Node) ArrayUseNumber

func (self *Node) ArrayUseNumber() ([]interface{}, error)

ArrayUseNumber loads all indexes of an array node, with numeric nodes casted to json.Number

func (*Node) Bool

func (self *Node) Bool() (bool, error)

Bool returns bool value represented by this node

If node type is not types.V_TRUE or types.V_FALSE, V_RAW (must be a bool json value), or V_ANY (must be a bool type) it will return error

func (*Node) Cap

func (self *Node) Cap() (int, error)

Cap returns malloc capacity of a array|object node for children

func (*Node) Check

func (self *Node) Check() error

Check checks if the node itself is valid, and return:

  • ErrNotFound If the node is nil
  • Its underlying error If the node is V_ERROR

func (Node) Error

func (self Node) Error() string

Error returns error message if the node is invalid

func (*Node) Exists

func (self *Node) Exists() bool

Exists returns false only if the self is nil or empty node V_NONE

func (*Node) Float64

func (self *Node) Float64() (float64, error)

Float64 casts node to float64, includeing V_NUMBER, V_TRUE, V_FALSE, V_ANY

func (*Node) ForEach

func (self *Node) ForEach(sc Scanner) error

ForEach scans one V_OBJECT node's children from JSON head to tail, and pass the Sequence and Node of corresponding JSON value.

Especailly, if the node is not V_ARRAY or V_OBJECT, the node itself will be returned and Sequence.Index == -1.

func (*Node) Get

func (self *Node) Get(key string) *Node

Get loads given key of an object node on demands

func (*Node) GetByPath

func (self *Node) GetByPath(path ...interface{}) *Node

GetByPath load given path on demands, which only ensure nodes before this path got parsed

func (*Node) Index

func (self *Node) Index(idx int) *Node

Index indexies node at given idx, node type CAN be either V_OBJECT or V_ARRAY

func (*Node) IndexOrGet

func (self *Node) IndexOrGet(idx int, key string) *Node

IndexOrGet firstly use idx to index a value and check if its key matches If not, then use the key to search value

func (*Node) IndexPair

func (self *Node) IndexPair(idx int) *Pair

IndexPair indexies pair at given idx, node type MUST be either V_OBJECT

func (*Node) Int64

func (self *Node) Int64() (int64, error)

Int64 casts the node to int64 value, including V_NUMBER, V_TRUE, V_FALSE, V_ANY, V_STRING of invalid digits

func (*Node) Interface

func (self *Node) Interface() (interface{}, error)

Interface loads all children under all pathes from this node, and converts itself as generic type. WARN: all numberic nodes are casted to float64

func (*Node) InterfaceUseNode

func (self *Node) InterfaceUseNode() (interface{}, error)

InterfaceUseNode clone itself as a new node, or its children as map[string]Node (or []Node)

func (*Node) InterfaceUseNumber

func (self *Node) InterfaceUseNumber() (interface{}, error)

InterfaceUseNumber works same with Interface() except numberic nodes are casted to json.Number

func (Node) IsRaw

func (self Node) IsRaw() bool

IsRaw returns true if node's underlying value is raw json

func (*Node) Len

func (self *Node) Len() (int, error)

Len returns children count of a array|object|string node For partially loaded node, it also works but only counts the parsed children

func (*Node) Load

func (self *Node) Load() error

Load loads the node's children as parsed. After calling it, only the node itself can be used on concurrency (not include its children)

func (*Node) LoadAll

func (self *Node) LoadAll() error

LoadAll loads all the node's children and children's children as parsed. After calling it, the node can be safely used on concurrency

func (*Node) Map

func (self *Node) Map() (map[string]interface{}, error)

Map loads all keys of an object node

func (*Node) MapUseNode

func (self *Node) MapUseNode() (map[string]Node, error)

MapUseNode scans both parsed and non-parsed chidren nodes, and map them by their keys

func (*Node) MapUseNumber

func (self *Node) MapUseNumber() (map[string]interface{}, error)

MapUseNumber loads all keys of an object node, with numeric nodes casted to json.Number

func (*Node) MarshalJSON

func (self *Node) MarshalJSON() ([]byte, error)

func (*Node) Number

func (self *Node) Number() (json.Number, error)

Number casts node to float64, including V_NUMBER, V_TRUE, V_FALSE, V_ANY of json.Number, V_STRING of invalid digits

func (*Node) Properties

func (self *Node) Properties() (ObjectIterator, error)

Properties returns iterator for object's children traversal

func (*Node) Raw

func (self *Node) Raw() (string, error)

Raw returns json representation of the node,

func (*Node) Set

func (self *Node) Set(key string, node Node) (bool, error)

Set sets the node of given key under self, and reports if the key has existed.

If self is V_NONE or V_NULL, it becomes V_OBJECT and sets the node at the key.

func (*Node) SetAny

func (self *Node) SetAny(key string, val interface{}) (bool, error)

SetAny wraps val with V_ANY node, and Set() the node.

func (*Node) SetAnyByIndex

func (self *Node) SetAnyByIndex(index int, val interface{}) (bool, error)

SetAny wraps val with V_ANY node, and SetByIndex() the node.

func (*Node) SetByIndex

func (self *Node) SetByIndex(index int, node Node) (bool, error)

SetByIndex sets the node of given index, and reports if the key has existed.

The index must be within self's children.

func (*Node) SortKeys

func (self *Node) SortKeys(recurse bool) (err error)

SortKeys sorts children of a V_OBJECT node in ascending key-order. If recurse is true, it recursively sorts children's children as long as a V_OBJECT node is found.

func (*Node) StrictFloat64

func (self *Node) StrictFloat64() (float64, error)

Float64 exports underlying float64 value, includeing V_NUMBER, V_ANY

func (*Node) StrictInt64

func (self *Node) StrictInt64() (int64, error)

StrictInt64 exports underlying int64 value, including V_NUMBER, V_ANY

func (*Node) StrictNumber

func (self *Node) StrictNumber() (json.Number, error)

Number exports underlying float64 value, including V_NUMBER, V_ANY of json.Number

func (*Node) StrictString

func (self *Node) StrictString() (string, error)

StrictString returns string value (unescaped), includeing V_STRING, V_ANY of string. In other cases, it will return empty string.

func (*Node) String

func (self *Node) String() (string, error)

String returns raw string value if node type is V_STRING. Or return the string representation of other types:

V_NULL => "null",
V_TRUE => "true",
V_FALSE => "false",
V_NUMBER => "[0-9\.]*"
V_ANY => interface{}.(string)

func (Node) Type

func (self Node) Type() int

Type returns json type represented by the node It will be one of belows:

V_NONE   = 0 (empty node)
V_ERROR  = 1 (error node)
V_NULL   = 2 (json value `null`)
V_TRUE   = 3 (json value `true`)
V_FALSE  = 4 (json value `false`)
V_ARRAY  = 5 (json value array)
V_OBJECT = 6 (json value object)
V_STRING = 7 (json value string)
V_NUMBER = 33 (json value number )
V_ANY    = 34 (golang interface{})

func (*Node) UnmarshalJSON

func (self *Node) UnmarshalJSON(data []byte) (err error)

UnmarshalJSON is just an adapter to json.Unmarshaler. If you want better performance, use Searcher.GetByPath() directly

func (*Node) UnsafeArray

func (self *Node) UnsafeArray() ([]Node, error)

ArrayUnsafe exports the underlying pointer to its children array WARN: don't use it unless you know what you are doing

func (*Node) UnsafeMap

func (self *Node) UnsafeMap() ([]Pair, error)

MapUnsafe exports the underlying pointer to its children map WARN: don't use it unless you know what you are doing

func (*Node) Unset

func (self *Node) Unset(key string) (bool, error)

Unset remove the node of given key under object parent, and reports if the key has existed.

func (*Node) UnsetByIndex

func (self *Node) UnsetByIndex(index int) (bool, error)

UnsetByIndex remove the node of given index

func (*Node) Valid

func (self *Node) Valid() bool

Valid reports if self is NOT V_ERROR or nil

func (*Node) Values

func (self *Node) Values() (ListIterator, error)

Values returns iterator for array's children traversal

type ObjectIterator

type ObjectIterator struct {
	Iterator
}

ObjectIterator is specialized iterator for V_ARRAY

func (*ObjectIterator) Next

func (self *ObjectIterator) Next(p *Pair) bool

Next scans through children of underlying V_OBJECT, copies each child to v, and returns .HasNext().

type Pair

type Pair struct {
	Key   string
	Value Node
}

type PairSlice

type PairSlice []Pair

func (PairSlice) Sort

func (self PairSlice) Sort()

type Parser

type Parser struct {
	// contains filtered or unexported fields
}

func NewParser

func NewParser(src string) *Parser

func (*Parser) ExportError

func (self *Parser) ExportError(err types.ParsingError) error

ExportError converts types.ParsingError to std Error

func (*Parser) Parse

func (self *Parser) Parse() (Node, types.ParsingError)

func (*Parser) Pos

func (self *Parser) Pos() int

type Scanner

type Scanner func(path Sequence, node *Node) bool

type Searcher

type Searcher struct {
	// contains filtered or unexported fields
}

func NewSearcher

func NewSearcher(str string) *Searcher

func (*Searcher) GetByPath

func (self *Searcher) GetByPath(path ...interface{}) (Node, error)

type Sequence

type Sequence struct {
	Index int
	Key   *string
}

Sequence represents scanning path of single-layer nodes. Index indicates the value's order in both V_ARRAY and V_OBJECT json. Key is the value's key (for V_OBJECT json only, otherwise it will be nil).

func (Sequence) String

func (s Sequence) String() string

String is string representation of one Sequence

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL