node.gno

20.65 Kb ยท 1083 lines
   1package json
   2
   3import (
   4	"errors"
   5	"strconv"
   6	"strings"
   7
   8	"gno.land/p/demo/ufmt"
   9)
  10
  11// Node represents a JSON node.
  12type Node struct {
  13	prev     *Node            // prev is the parent node of the current node.
  14	next     map[string]*Node // next is the child nodes of the current node.
  15	key      *string          // key holds the key of the current node in the parent node.
  16	data     []byte           // byte slice of JSON data
  17	value    any              // value holds the value of the current node.
  18	nodeType ValueType        // NodeType holds the type of the current node. (Object, Array, String, Number, Boolean, Null)
  19	index    *int             // index holds the index of the current node in the parent array node.
  20	borders  [2]int           // borders stores the start and end index of the current node in the data.
  21	modified bool             // modified indicates the current node is changed or not.
  22}
  23
  24// NewNode creates a new node instance with the given parent node, buffer, type, and key.
  25func NewNode(prev *Node, b *buffer, typ ValueType, key **string) (*Node, error) {
  26	curr := &Node{
  27		prev:     prev,
  28		data:     b.data,
  29		borders:  [2]int{b.index, 0},
  30		key:      *key,
  31		nodeType: typ,
  32		modified: false,
  33	}
  34
  35	if typ == Object || typ == Array {
  36		curr.next = make(map[string]*Node)
  37	}
  38
  39	if prev != nil {
  40		if prev.IsArray() {
  41			size := len(prev.next)
  42			curr.index = &size
  43
  44			prev.next[strconv.Itoa(size)] = curr
  45		} else if prev.IsObject() {
  46			if key == nil {
  47				return nil, errKeyRequired
  48			}
  49
  50			prev.next[**key] = curr
  51		} else {
  52			return nil, errors.New("invalid parent type")
  53		}
  54	}
  55
  56	return curr, nil
  57}
  58
  59// load retrieves the value of the current node.
  60func (n *Node) load() any {
  61	return n.value
  62}
  63
  64// Changed checks the current node is changed or not.
  65func (n *Node) Changed() bool {
  66	return n.modified
  67}
  68
  69// Key returns the key of the current node.
  70func (n *Node) Key() string {
  71	if n == nil || n.key == nil {
  72		return ""
  73	}
  74
  75	return *n.key
  76}
  77
  78// HasKey checks the current node has the given key or not.
  79func (n *Node) HasKey(key string) bool {
  80	if n == nil {
  81		return false
  82	}
  83
  84	_, ok := n.next[key]
  85	return ok
  86}
  87
  88// GetKey returns the value of the given key from the current object node.
  89func (n *Node) GetKey(key string) (*Node, error) {
  90	if n == nil {
  91		return nil, errNilNode
  92	}
  93
  94	if n.Type() != Object {
  95		return nil, ufmt.Errorf("target node is not object type. got: %s", n.Type().String())
  96	}
  97
  98	value, ok := n.next[key]
  99	if !ok {
 100		return nil, ufmt.Errorf("key not found: %s", key)
 101	}
 102
 103	return value, nil
 104}
 105
 106// MustKey returns the value of the given key from the current object node.
 107func (n *Node) MustKey(key string) *Node {
 108	val, err := n.GetKey(key)
 109	if err != nil {
 110		panic(err)
 111	}
 112
 113	return val
 114}
 115
 116// UniqueKeyLists traverses the current JSON nodes and collects all the unique keys.
 117func (n *Node) UniqueKeyLists() []string {
 118	var collectKeys func(*Node) []string
 119	collectKeys = func(node *Node) []string {
 120		if node == nil || !node.IsObject() {
 121			return nil
 122		}
 123
 124		result := make(map[string]bool)
 125		for key, childNode := range node.next {
 126			result[key] = true
 127			childKeys := collectKeys(childNode)
 128			for _, childKey := range childKeys {
 129				result[childKey] = true
 130			}
 131		}
 132
 133		keys := make([]string, 0, len(result))
 134		for key := range result {
 135			keys = append(keys, key)
 136		}
 137		return keys
 138	}
 139
 140	return collectKeys(n)
 141}
 142
 143// Empty returns true if the current node is empty.
 144func (n *Node) Empty() bool {
 145	if n == nil {
 146		return false
 147	}
 148
 149	return len(n.next) == 0
 150}
 151
 152// Type returns the type (ValueType) of the current node.
 153func (n *Node) Type() ValueType {
 154	return n.nodeType
 155}
 156
 157// Value returns the value of the current node.
 158//
 159// Usage:
 160//
 161//	root := Unmarshal([]byte(`{"key": "value"}`))
 162//	val, err := root.MustKey("key").Value()
 163//	if err != nil {
 164//		t.Errorf("Value returns error: %v", err)
 165//	}
 166//
 167//	result: "value"
 168func (n *Node) Value() (value any, err error) {
 169	value = n.load()
 170
 171	if value == nil {
 172		switch n.nodeType {
 173		case Null:
 174			return nil, nil
 175
 176		case Number:
 177			value, err = strconv.ParseFloat(string(n.source()), 64)
 178			if err != nil {
 179				return nil, err
 180			}
 181
 182			n.value = value
 183
 184		case String:
 185			var ok bool
 186			value, ok = Unquote(n.source(), doubleQuote)
 187			if !ok {
 188				return "", errInvalidStringValue
 189			}
 190
 191			n.value = value
 192
 193		case Boolean:
 194			if len(n.source()) == 0 {
 195				return nil, errEmptyBooleanNode
 196			}
 197
 198			b := n.source()[0]
 199			value = b == 't' || b == 'T'
 200			n.value = value
 201
 202		case Array:
 203			elems := make([]*Node, len(n.next))
 204
 205			for _, e := range n.next {
 206				elems[*e.index] = e
 207			}
 208
 209			value = elems
 210			n.value = value
 211
 212		case Object:
 213			obj := make(map[string]*Node, len(n.next))
 214
 215			for k, v := range n.next {
 216				obj[k] = v
 217			}
 218
 219			value = obj
 220			n.value = value
 221		}
 222	}
 223
 224	return value, nil
 225}
 226
 227// Delete removes the current node from the parent node.
 228//
 229// Usage:
 230//
 231//	root := Unmarshal([]byte(`{"key": "value"}`))
 232//	if err := root.MustKey("key").Delete(); err != nil {
 233//		t.Errorf("Delete returns error: %v", err)
 234//	}
 235//
 236//	result: {} (empty object)
 237func (n *Node) Delete() error {
 238	if n == nil {
 239		return errors.New("can't delete nil node")
 240	}
 241
 242	if n.prev == nil {
 243		return nil
 244	}
 245
 246	return n.prev.remove(n)
 247}
 248
 249// Size returns the size (length) of the current array node.
 250//
 251// Usage:
 252//
 253//	root := ArrayNode("", []*Node{StringNode("", "foo"), NumberNode("", 1)})
 254//	if root == nil {
 255//		t.Errorf("ArrayNode returns nil")
 256//	}
 257//
 258//	if root.Size() != 2 {
 259//		t.Errorf("ArrayNode returns wrong size: %d", root.Size())
 260//	}
 261func (n *Node) Size() int {
 262	if n == nil {
 263		return 0
 264	}
 265
 266	return len(n.next)
 267}
 268
 269// Index returns the index of the current node in the parent array node.
 270//
 271// Usage:
 272//
 273//	root := ArrayNode("", []*Node{StringNode("", "foo"), NumberNode("", 1)})
 274//	if root == nil {
 275//		t.Errorf("ArrayNode returns nil")
 276//	}
 277//
 278//	if root.MustIndex(1).Index() != 1 {
 279//		t.Errorf("Index returns wrong index: %d", root.MustIndex(1).Index())
 280//	}
 281//
 282// We can also use the index to the byte slice of the JSON data directly.
 283//
 284// Example:
 285//
 286//	root := Unmarshal([]byte(`["foo", 1]`))
 287//	if root == nil {
 288//		t.Errorf("Unmarshal returns nil")
 289//	}
 290//
 291//	if string(root.MustIndex(1).source()) != "1" {
 292//		t.Errorf("source returns wrong result: %s", root.MustIndex(1).source())
 293//	}
 294func (n *Node) Index() int {
 295	if n == nil || n.index == nil {
 296		return -1
 297	}
 298
 299	return *n.index
 300}
 301
 302// MustIndex returns the array element at the given index.
 303//
 304// If the index is negative, it returns the index is from the end of the array.
 305// Also, it panics if the index is not found.
 306//
 307// check the Index method for detailed usage.
 308func (n *Node) MustIndex(expectIdx int) *Node {
 309	val, err := n.GetIndex(expectIdx)
 310	if err != nil {
 311		panic(err)
 312	}
 313
 314	return val
 315}
 316
 317// GetIndex returns the array element at the given index.
 318//
 319// if the index is negative, it returns the index is from the end of the array.
 320func (n *Node) GetIndex(idx int) (*Node, error) {
 321	if n == nil {
 322		return nil, errNilNode
 323	}
 324
 325	if !n.IsArray() {
 326		return nil, errNotArrayNode
 327	}
 328
 329	if idx > n.Size() {
 330		return nil, errors.New("input index exceeds the array size")
 331	}
 332
 333	if idx < 0 {
 334		idx += len(n.next)
 335	}
 336
 337	child, ok := n.next[strconv.Itoa(idx)]
 338	if !ok {
 339		return nil, errIndexNotFound
 340	}
 341
 342	return child, nil
 343}
 344
 345// DeleteIndex removes the array element at the given index.
 346func (n *Node) DeleteIndex(idx int) error {
 347	node, err := n.GetIndex(idx)
 348	if err != nil {
 349		return err
 350	}
 351
 352	return n.remove(node)
 353}
 354
 355// NullNode creates a new null type node.
 356//
 357// Usage:
 358//
 359//	_ := NullNode("")
 360func NullNode(key string) *Node {
 361	return &Node{
 362		key:      &key,
 363		value:    nil,
 364		nodeType: Null,
 365		modified: true,
 366	}
 367}
 368
 369// NumberNode creates a new number type node.
 370//
 371// Usage:
 372//
 373//	root := NumberNode("", 1)
 374//	if root == nil {
 375//		t.Errorf("NumberNode returns nil")
 376//	}
 377func NumberNode(key string, value float64) *Node {
 378	return &Node{
 379		key:      &key,
 380		value:    value,
 381		nodeType: Number,
 382		modified: true,
 383	}
 384}
 385
 386// StringNode creates a new string type node.
 387//
 388// Usage:
 389//
 390//	root := StringNode("", "foo")
 391//	if root == nil {
 392//		t.Errorf("StringNode returns nil")
 393//	}
 394func StringNode(key string, value string) *Node {
 395	return &Node{
 396		key:      &key,
 397		value:    value,
 398		nodeType: String,
 399		modified: true,
 400	}
 401}
 402
 403// BoolNode creates a new given boolean value node.
 404//
 405// Usage:
 406//
 407//	root := BoolNode("", true)
 408//	if root == nil {
 409//		t.Errorf("BoolNode returns nil")
 410//	}
 411func BoolNode(key string, value bool) *Node {
 412	return &Node{
 413		key:      &key,
 414		value:    value,
 415		nodeType: Boolean,
 416		modified: true,
 417	}
 418}
 419
 420// ArrayNode creates a new array type node.
 421//
 422// If the given value is nil, it creates an empty array node.
 423//
 424// Usage:
 425//
 426//	root := ArrayNode("", []*Node{StringNode("", "foo"), NumberNode("", 1)})
 427//	if root == nil {
 428//		t.Errorf("ArrayNode returns nil")
 429//	}
 430func ArrayNode(key string, value []*Node) *Node {
 431	curr := &Node{
 432		key:      &key,
 433		nodeType: Array,
 434		modified: true,
 435	}
 436
 437	curr.next = make(map[string]*Node, len(value))
 438	if value != nil {
 439		curr.value = value
 440
 441		for i, v := range value {
 442			idx := i
 443			curr.next[strconv.Itoa(i)] = v
 444
 445			v.prev = curr
 446			v.index = &idx
 447		}
 448	}
 449
 450	return curr
 451}
 452
 453// ObjectNode creates a new object type node.
 454//
 455// If the given value is nil, it creates an empty object node.
 456//
 457// next is a map of key and value pairs of the object.
 458func ObjectNode(key string, value map[string]*Node) *Node {
 459	curr := &Node{
 460		nodeType: Object,
 461		key:      &key,
 462		next:     value,
 463		modified: true,
 464	}
 465
 466	if value != nil {
 467		curr.value = value
 468
 469		for key, val := range value {
 470			vkey := key
 471			val.prev = curr
 472			val.key = &vkey
 473		}
 474	} else {
 475		curr.next = make(map[string]*Node)
 476	}
 477
 478	return curr
 479}
 480
 481// IsArray returns true if the current node is array type.
 482func (n *Node) IsArray() bool {
 483	return n.nodeType == Array
 484}
 485
 486// IsObject returns true if the current node is object type.
 487func (n *Node) IsObject() bool {
 488	return n.nodeType == Object
 489}
 490
 491// IsNull returns true if the current node is null type.
 492func (n *Node) IsNull() bool {
 493	return n.nodeType == Null
 494}
 495
 496// IsBool returns true if the current node is boolean type.
 497func (n *Node) IsBool() bool {
 498	return n.nodeType == Boolean
 499}
 500
 501// IsString returns true if the current node is string type.
 502func (n *Node) IsString() bool {
 503	return n.nodeType == String
 504}
 505
 506// IsNumber returns true if the current node is number type.
 507func (n *Node) IsNumber() bool {
 508	return n.nodeType == Number
 509}
 510
 511// ready checks the current node is ready or not.
 512//
 513// the meaning of ready is the current node is parsed and has a valid value.
 514func (n *Node) ready() bool {
 515	return n.borders[1] != 0
 516}
 517
 518// source returns the source of the current node.
 519func (n *Node) source() []byte {
 520	if n == nil {
 521		return nil
 522	}
 523
 524	if n.ready() && !n.modified && n.data != nil {
 525		return (n.data)[n.borders[0]:n.borders[1]]
 526	}
 527
 528	return nil
 529}
 530
 531// root returns the root node of the current node.
 532func (n *Node) root() *Node {
 533	if n == nil {
 534		return nil
 535	}
 536
 537	curr := n
 538	for curr.prev != nil {
 539		curr = curr.prev
 540	}
 541
 542	return curr
 543}
 544
 545// GetNull returns the null value if current node is null type.
 546//
 547// Usage:
 548//
 549//	root := Unmarshal([]byte("null"))
 550//	val, err := root.GetNull()
 551//	if err != nil {
 552//		t.Errorf("GetNull returns error: %v", err)
 553//	}
 554//	if val != nil {
 555//		t.Errorf("GetNull returns wrong result: %v", val)
 556//	}
 557func (n *Node) GetNull() (any, error) {
 558	if n == nil {
 559		return nil, errNilNode
 560	}
 561
 562	if !n.IsNull() {
 563		return nil, errNotNullNode
 564	}
 565
 566	return nil, nil
 567}
 568
 569// MustNull returns the null value if current node is null type.
 570//
 571// It panics if the current node is not null type.
 572func (n *Node) MustNull() any {
 573	v, err := n.GetNull()
 574	if err != nil {
 575		panic(err)
 576	}
 577
 578	return v
 579}
 580
 581// GetNumeric returns the numeric (int/float) value if current node is number type.
 582//
 583// Usage:
 584//
 585//	root := Unmarshal([]byte("10.5"))
 586//	val, err := root.GetNumeric()
 587//	if err != nil {
 588//		t.Errorf("GetNumeric returns error: %v", err)
 589//	}
 590//	println(val) // 10.5
 591func (n *Node) GetNumeric() (float64, error) {
 592	if n == nil {
 593		return 0, errNilNode
 594	}
 595
 596	if n.nodeType != Number {
 597		return 0, errNotNumberNode
 598	}
 599
 600	val, err := n.Value()
 601	if err != nil {
 602		return 0, err
 603	}
 604
 605	v, ok := val.(float64)
 606	if !ok {
 607		return 0, errNotNumberNode
 608	}
 609
 610	return v, nil
 611}
 612
 613// MustNumeric returns the numeric (int/float) value if current node is number type.
 614//
 615// It panics if the current node is not number type.
 616func (n *Node) MustNumeric() float64 {
 617	v, err := n.GetNumeric()
 618	if err != nil {
 619		panic(err)
 620	}
 621
 622	return v
 623}
 624
 625// GetString returns the string value if current node is string type.
 626//
 627// Usage:
 628//
 629//	root, err := Unmarshal([]byte("foo"))
 630//	if err != nil {
 631//		t.Errorf("Error on Unmarshal(): %s", err)
 632//	}
 633//
 634//	str, err := root.GetString()
 635//	if err != nil {
 636//		t.Errorf("should retrieve string value: %s", err)
 637//	}
 638//
 639//	println(str) // "foo"
 640func (n *Node) GetString() (string, error) {
 641	if n == nil {
 642		return "", errEmptyStringNode
 643	}
 644
 645	if !n.IsString() {
 646		return "", errNotStringNode
 647	}
 648
 649	val, err := n.Value()
 650	if err != nil {
 651		return "", err
 652	}
 653
 654	v, ok := val.(string)
 655	if !ok {
 656		return "", errNotStringNode
 657	}
 658
 659	return v, nil
 660}
 661
 662// MustString returns the string value if current node is string type.
 663//
 664// It panics if the current node is not string type.
 665func (n *Node) MustString() string {
 666	v, err := n.GetString()
 667	if err != nil {
 668		panic(err)
 669	}
 670
 671	return v
 672}
 673
 674// GetBool returns the boolean value if current node is boolean type.
 675//
 676// Usage:
 677//
 678//	root := Unmarshal([]byte("true"))
 679//	val, err := root.GetBool()
 680//	if err != nil {
 681//		t.Errorf("GetBool returns error: %v", err)
 682//	}
 683//	println(val) // true
 684func (n *Node) GetBool() (bool, error) {
 685	if n == nil {
 686		return false, errNilNode
 687	}
 688
 689	if n.nodeType != Boolean {
 690		return false, errNotBoolNode
 691	}
 692
 693	val, err := n.Value()
 694	if err != nil {
 695		return false, err
 696	}
 697
 698	v, ok := val.(bool)
 699	if !ok {
 700		return false, errNotBoolNode
 701	}
 702
 703	return v, nil
 704}
 705
 706// MustBool returns the boolean value if current node is boolean type.
 707//
 708// It panics if the current node is not boolean type.
 709func (n *Node) MustBool() bool {
 710	v, err := n.GetBool()
 711	if err != nil {
 712		panic(err)
 713	}
 714
 715	return v
 716}
 717
 718// GetArray returns the array value if current node is array type.
 719//
 720// Usage:
 721//
 722//		root := Must(Unmarshal([]byte(`["foo", 1]`)))
 723//		arr, err := root.GetArray()
 724//		if err != nil {
 725//			t.Errorf("GetArray returns error: %v", err)
 726//		}
 727//
 728//		for _, val := range arr {
 729//			println(val)
 730//		}
 731//
 732//	 result: "foo", 1
 733func (n *Node) GetArray() ([]*Node, error) {
 734	if n == nil {
 735		return nil, errNilNode
 736	}
 737
 738	if n.nodeType != Array {
 739		return nil, errNotArrayNode
 740	}
 741
 742	val, err := n.Value()
 743	if err != nil {
 744		return nil, err
 745	}
 746
 747	v, ok := val.([]*Node)
 748	if !ok {
 749		return nil, errNotArrayNode
 750	}
 751
 752	return v, nil
 753}
 754
 755// MustArray returns the array value if current node is array type.
 756//
 757// It panics if the current node is not array type.
 758func (n *Node) MustArray() []*Node {
 759	v, err := n.GetArray()
 760	if err != nil {
 761		panic(err)
 762	}
 763
 764	return v
 765}
 766
 767// AppendArray appends the given values to the current array node.
 768//
 769// If the current node is not array type, it returns an error.
 770//
 771// Example 1:
 772//
 773//	root := Must(Unmarshal([]byte(`[{"foo":"bar"}]`)))
 774//	if err := root.AppendArray(NullNode("")); err != nil {
 775//		t.Errorf("should not return error: %s", err)
 776//	}
 777//
 778//	result: [{"foo":"bar"}, null]
 779//
 780// Example 2:
 781//
 782//	root := Must(Unmarshal([]byte(`["bar", "baz"]`)))
 783//	err := root.AppendArray(NumberNode("", 1), StringNode("", "foo"))
 784//	if err != nil {
 785//		t.Errorf("AppendArray returns error: %v", err)
 786//	 }
 787//
 788//	result: ["bar", "baz", 1, "foo"]
 789func (n *Node) AppendArray(value ...*Node) error {
 790	if !n.IsArray() {
 791		return errInvalidAppend
 792	}
 793
 794	for _, val := range value {
 795		if err := n.append(nil, val); err != nil {
 796			return err
 797		}
 798	}
 799
 800	n.mark()
 801	return nil
 802}
 803
 804// ArrayEach executes the callback for each element in the JSON array.
 805//
 806// Usage:
 807//
 808//	jsonArrayNode.ArrayEach(func(i int, valueNode *Node) {
 809//	    ufmt.Println(i, valueNode)
 810//	})
 811func (n *Node) ArrayEach(callback func(i int, target *Node)) {
 812	if n == nil || !n.IsArray() {
 813		return
 814	}
 815
 816	for idx := 0; idx < len(n.next); idx++ {
 817		element, err := n.GetIndex(idx)
 818		if err != nil {
 819			continue
 820		}
 821
 822		callback(idx, element)
 823	}
 824}
 825
 826// GetObject returns the object value if current node is object type.
 827//
 828// Usage:
 829//
 830//	root := Must(Unmarshal([]byte(`{"key": "value"}`)))
 831//	obj, err := root.GetObject()
 832//	if err != nil {
 833//		t.Errorf("GetObject returns error: %v", err)
 834//	}
 835//
 836//	result: map[string]*Node{"key": StringNode("key", "value")}
 837func (n *Node) GetObject() (map[string]*Node, error) {
 838	if n == nil {
 839		return nil, errNilNode
 840	}
 841
 842	if !n.IsObject() {
 843		return nil, errNotObjectNode
 844	}
 845
 846	val, err := n.Value()
 847	if err != nil {
 848		return nil, err
 849	}
 850
 851	v, ok := val.(map[string]*Node)
 852	if !ok {
 853		return nil, errNotObjectNode
 854	}
 855
 856	return v, nil
 857}
 858
 859// MustObject returns the object value if current node is object type.
 860//
 861// It panics if the current node is not object type.
 862func (n *Node) MustObject() map[string]*Node {
 863	v, err := n.GetObject()
 864	if err != nil {
 865		panic(err)
 866	}
 867
 868	return v
 869}
 870
 871// AppendObject appends the given key and value to the current object node.
 872//
 873// If the current node is not object type, it returns an error.
 874func (n *Node) AppendObject(key string, value *Node) error {
 875	if !n.IsObject() {
 876		return errInvalidAppend
 877	}
 878
 879	if err := n.append(&key, value); err != nil {
 880		return err
 881	}
 882
 883	n.mark()
 884	return nil
 885}
 886
 887// ObjectEach executes the callback for each key-value pair in the JSON object.
 888//
 889// Usage:
 890//
 891//	jsonObjectNode.ObjectEach(func(key string, valueNode *Node) {
 892//	    ufmt.Println(key, valueNode)
 893//	})
 894func (n *Node) ObjectEach(callback func(key string, value *Node)) {
 895	if n == nil || !n.IsObject() {
 896		return
 897	}
 898
 899	for key, child := range n.next {
 900		callback(key, child)
 901	}
 902}
 903
 904// String converts the node to a string representation.
 905func (n *Node) String() string {
 906	if n == nil {
 907		return ""
 908	}
 909
 910	if n.ready() && !n.modified {
 911		return string(n.source())
 912	}
 913
 914	val, err := Marshal(n)
 915	if err != nil {
 916		return "error: " + err.Error()
 917	}
 918
 919	return string(val)
 920}
 921
 922// Path builds the path of the current node.
 923//
 924// For example:
 925//
 926//	{ "key": { "sub": [ "val1", "val2" ] }}
 927//
 928// The path of "val2" is: $.key.sub[1]
 929func (n *Node) Path() string {
 930	if n == nil {
 931		return ""
 932	}
 933
 934	var sb strings.Builder
 935
 936	if n.prev == nil {
 937		sb.WriteString("$")
 938	} else {
 939		sb.WriteString(n.prev.Path())
 940
 941		if n.key != nil {
 942			sb.WriteString("['" + n.Key() + "']")
 943		} else {
 944			sb.WriteString("[" + strconv.Itoa(n.Index()) + "]")
 945		}
 946	}
 947
 948	return sb.String()
 949}
 950
 951// mark marks the current node as modified.
 952func (n *Node) mark() {
 953	node := n
 954	for node != nil && !node.modified {
 955		node.modified = true
 956		node = node.prev
 957	}
 958}
 959
 960// isContainer checks the current node type is array or object.
 961func (n *Node) isContainer() bool {
 962	return n.IsArray() || n.IsObject()
 963}
 964
 965// remove removes the value from the current container type node.
 966func (n *Node) remove(v *Node) error {
 967	if !n.isContainer() {
 968		return ufmt.Errorf(
 969			"can't remove value from non-array or non-object node. got=%s",
 970			n.Type().String(),
 971		)
 972	}
 973
 974	if v.prev != n {
 975		return errors.New("invalid parent node")
 976	}
 977
 978	n.mark()
 979	if n.IsArray() {
 980		delete(n.next, strconv.Itoa(*v.index))
 981		n.dropIndex(*v.index)
 982	} else {
 983		delete(n.next, *v.key)
 984	}
 985
 986	v.prev = nil
 987	return nil
 988}
 989
 990// dropIndex rebase the index of current array node values.
 991func (n *Node) dropIndex(idx int) {
 992	for i := idx + 1; i <= len(n.next); i++ {
 993		prv := i - 1
 994		if curr, ok := n.next[strconv.Itoa(i)]; ok {
 995			curr.index = &prv
 996			n.next[strconv.Itoa(prv)] = curr
 997		}
 998
 999		delete(n.next, strconv.Itoa(i))
1000	}
1001}
1002
1003// append is a helper function to append the given value to the current container type node.
1004func (n *Node) append(key *string, val *Node) error {
1005	if n.isSameOrParentNode(val) {
1006		return errInvalidAppendCycle
1007	}
1008
1009	if val.prev != nil {
1010		if err := val.prev.remove(val); err != nil {
1011			return err
1012		}
1013	}
1014
1015	val.prev = n
1016	val.key = key
1017
1018	if key == nil {
1019		size := len(n.next)
1020		val.index = &size
1021		n.next[strconv.Itoa(size)] = val
1022	} else {
1023		if old, ok := n.next[*key]; ok {
1024			if err := n.remove(old); err != nil {
1025				return err
1026			}
1027		}
1028		n.next[*key] = val
1029	}
1030
1031	return nil
1032}
1033
1034func (n *Node) isSameOrParentNode(nd *Node) bool {
1035	return n == nd || n.isParentNode(nd)
1036}
1037
1038func (n *Node) isParentNode(nd *Node) bool {
1039	if n == nil {
1040		return false
1041	}
1042
1043	for curr := nd.prev; curr != nil; curr = curr.prev {
1044		if curr == n {
1045			return true
1046		}
1047	}
1048
1049	return false
1050}
1051
1052// cptrs returns the pointer of the given string value.
1053func cptrs(cpy *string) *string {
1054	if cpy == nil {
1055		return nil
1056	}
1057
1058	val := *cpy
1059
1060	return &val
1061}
1062
1063// cptri returns the pointer of the given integer value.
1064func cptri(i *int) *int {
1065	if i == nil {
1066		return nil
1067	}
1068
1069	val := *i
1070	return &val
1071}
1072
1073// Must panics if the given node is not fulfilled the expectation.
1074// Usage:
1075//
1076//	node := Must(Unmarshal([]byte(`{"key": "value"}`))
1077func Must(root *Node, expect error) *Node {
1078	if expect != nil {
1079		panic(expect)
1080	}
1081
1082	return root
1083}