1
16
17 package ast
18
19 import (
20 `encoding/json`
21 `fmt`
22 `strconv`
23 `unsafe`
24
25 `github.com/bytedance/sonic/internal/native/types`
26 `github.com/bytedance/sonic/internal/rt`
27 )
28
29 const (
30 _V_NONE types.ValueType = 0
31 _V_NODE_BASE types.ValueType = 1 << 5
32 _V_LAZY types.ValueType = 1 << 7
33 _V_RAW types.ValueType = 1 << 8
34 _V_NUMBER = _V_NODE_BASE + 1
35 _V_ANY = _V_NODE_BASE + 2
36 _V_ARRAY_LAZY = _V_LAZY | types.V_ARRAY
37 _V_OBJECT_LAZY = _V_LAZY | types.V_OBJECT
38 _MASK_LAZY = _V_LAZY - 1
39 _MASK_RAW = _V_RAW - 1
40 )
41
42 const (
43 V_NONE = 0
44 V_ERROR = 1
45 V_NULL = int(types.V_NULL)
46 V_TRUE = int(types.V_TRUE)
47 V_FALSE = int(types.V_FALSE)
48 V_ARRAY = int(types.V_ARRAY)
49 V_OBJECT = int(types.V_OBJECT)
50 V_STRING = int(types.V_STRING)
51 V_NUMBER = int(_V_NUMBER)
52 V_ANY = int(_V_ANY)
53 )
54
55 type Node struct {
56 t types.ValueType
57 l uint
58 p unsafe.Pointer
59 }
60
61
62
63 func (self *Node) UnmarshalJSON(data []byte) (err error) {
64 *self = NewRaw(string(data))
65 return self.Check()
66 }
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 func (self Node) Type() int {
83 return int(self.t & _MASK_LAZY & _MASK_RAW)
84 }
85
86 func (self Node) itype() types.ValueType {
87 return self.t & _MASK_LAZY & _MASK_RAW
88 }
89
90
91 func (self *Node) Exists() bool {
92 return self.Valid() && self.t != _V_NONE
93 }
94
95
96 func (self *Node) Valid() bool {
97 if self == nil {
98 return false
99 }
100 return self.t != V_ERROR
101 }
102
103
104
105
106 func (self *Node) Check() error {
107 if self == nil {
108 return ErrNotExist
109 } else if self.t != V_ERROR {
110 return nil
111 } else {
112 return self
113 }
114 }
115
116
117 func (self Node) IsRaw() bool {
118 return self.t&_V_RAW != 0
119 }
120
121 func (self *Node) isLazy() bool {
122 return self != nil && self.t&_V_LAZY != 0
123 }
124
125 func (self *Node) isAny() bool {
126 return self != nil && self.t == _V_ANY
127 }
128
129
130
131
132 func (self *Node) Raw() (string, error) {
133 if self == nil {
134 return "", ErrNotExist
135 }
136 if !self.IsRaw() {
137 buf, err := self.MarshalJSON()
138 return rt.Mem2Str(buf), err
139 }
140 return self.toString(), nil
141 }
142
143 func (self *Node) checkRaw() error {
144 if err := self.Check(); err != nil {
145 return err
146 }
147 if self.IsRaw() {
148 self.parseRaw(false)
149 }
150 return self.Check()
151 }
152
153
154
155
156 func (self *Node) Bool() (bool, error) {
157 if err := self.checkRaw(); err != nil {
158 return false, err
159 }
160 switch self.t {
161 case types.V_TRUE : return true , nil
162 case types.V_FALSE : return false, nil
163 case types.V_NULL : return false, nil
164 case _V_NUMBER :
165 if i, err := self.toInt64(); err == nil {
166 return i != 0, nil
167 } else if f, err := self.toFloat64(); err == nil {
168 return f != 0, nil
169 } else {
170 return false, err
171 }
172 case types.V_STRING: return strconv.ParseBool(self.toString())
173 case _V_ANY :
174 any := self.packAny()
175 switch v := any.(type) {
176 case bool : return v, nil
177 case int : return v != 0, nil
178 case int8 : return v != 0, nil
179 case int16 : return v != 0, nil
180 case int32 : return v != 0, nil
181 case int64 : return v != 0, nil
182 case uint : return v != 0, nil
183 case uint8 : return v != 0, nil
184 case uint16 : return v != 0, nil
185 case uint32 : return v != 0, nil
186 case uint64 : return v != 0, nil
187 case float32: return v != 0, nil
188 case float64: return v != 0, nil
189 case string : return strconv.ParseBool(v)
190 case json.Number:
191 if i, err := v.Int64(); err == nil {
192 return i != 0, nil
193 } else if f, err := v.Float64(); err == nil {
194 return f != 0, nil
195 } else {
196 return false, err
197 }
198 default: return false, ErrUnsupportType
199 }
200 default : return false, ErrUnsupportType
201 }
202 }
203
204
205
206
207 func (self *Node) Int64() (int64, error) {
208 if err := self.checkRaw(); err != nil {
209 return 0, err
210 }
211 switch self.t {
212 case _V_NUMBER, types.V_STRING :
213 if i, err := self.toInt64(); err == nil {
214 return i, nil
215 } else if f, err := self.toFloat64(); err == nil {
216 return int64(f), nil
217 } else {
218 return 0, err
219 }
220 case types.V_TRUE : return 1, nil
221 case types.V_FALSE : return 0, nil
222 case types.V_NULL : return 0, nil
223 case _V_ANY :
224 any := self.packAny()
225 switch v := any.(type) {
226 case bool : if v { return 1, nil } else { return 0, nil }
227 case int : return int64(v), nil
228 case int8 : return int64(v), nil
229 case int16 : return int64(v), nil
230 case int32 : return int64(v), nil
231 case int64 : return int64(v), nil
232 case uint : return int64(v), nil
233 case uint8 : return int64(v), nil
234 case uint16 : return int64(v), nil
235 case uint32 : return int64(v), nil
236 case uint64 : return int64(v), nil
237 case float32: return int64(v), nil
238 case float64: return int64(v), nil
239 case string :
240 if i, err := strconv.ParseInt(v, 10, 64); err == nil {
241 return i, nil
242 } else if f, err := strconv.ParseFloat(v, 64); err == nil {
243 return int64(f), nil
244 } else {
245 return 0, err
246 }
247 case json.Number:
248 if i, err := v.Int64(); err == nil {
249 return i, nil
250 } else if f, err := v.Float64(); err == nil {
251 return int64(f), nil
252 } else {
253 return 0, err
254 }
255 default: return 0, ErrUnsupportType
256 }
257 default : return 0, ErrUnsupportType
258 }
259 }
260
261
262 func (self *Node) StrictInt64() (int64, error) {
263 if err := self.checkRaw(); err != nil {
264 return 0, err
265 }
266 switch self.t {
267 case _V_NUMBER : return self.toInt64()
268 case _V_ANY :
269 any := self.packAny()
270 switch v := any.(type) {
271 case int : return int64(v), nil
272 case int8 : return int64(v), nil
273 case int16 : return int64(v), nil
274 case int32 : return int64(v), nil
275 case int64 : return int64(v), nil
276 case uint : return int64(v), nil
277 case uint8 : return int64(v), nil
278 case uint16: return int64(v), nil
279 case uint32: return int64(v), nil
280 case uint64: return int64(v), nil
281 case json.Number:
282 if i, err := v.Int64(); err == nil {
283 return i, nil
284 } else {
285 return 0, err
286 }
287 default: return 0, ErrUnsupportType
288 }
289 default : return 0, ErrUnsupportType
290 }
291 }
292
293 func castNumber(v bool) json.Number {
294 if v {
295 return json.Number("1")
296 } else {
297 return json.Number("0")
298 }
299 }
300
301
302
303
304 func (self *Node) Number() (json.Number, error) {
305 if err := self.checkRaw(); err != nil {
306 return json.Number(""), err
307 }
308 switch self.t {
309 case _V_NUMBER : return self.toNumber(), nil
310 case types.V_STRING :
311 if _, err := self.toInt64(); err == nil {
312 return self.toNumber(), nil
313 } else if _, err := self.toFloat64(); err == nil {
314 return self.toNumber(), nil
315 } else {
316 return json.Number(""), err
317 }
318 case types.V_TRUE : return json.Number("1"), nil
319 case types.V_FALSE : return json.Number("0"), nil
320 case types.V_NULL : return json.Number("0"), nil
321 case _V_ANY :
322 any := self.packAny()
323 switch v := any.(type) {
324 case bool : return castNumber(v), nil
325 case int : return castNumber(v != 0), nil
326 case int8 : return castNumber(v != 0), nil
327 case int16 : return castNumber(v != 0), nil
328 case int32 : return castNumber(v != 0), nil
329 case int64 : return castNumber(v != 0), nil
330 case uint : return castNumber(v != 0), nil
331 case uint8 : return castNumber(v != 0), nil
332 case uint16 : return castNumber(v != 0), nil
333 case uint32 : return castNumber(v != 0), nil
334 case uint64 : return castNumber(v != 0), nil
335 case float32: return castNumber(v != 0), nil
336 case float64: return castNumber(v != 0), nil
337 case string :
338 if _, err := strconv.ParseFloat(v, 64); err == nil {
339 return json.Number(v), nil
340 } else {
341 return json.Number(""), err
342 }
343 case json.Number: return v, nil
344 default: return json.Number(""), ErrUnsupportType
345 }
346 default : return json.Number(""), ErrUnsupportType
347 }
348 }
349
350
351 func (self *Node) StrictNumber() (json.Number, error) {
352 if err := self.checkRaw(); err != nil {
353 return json.Number(""), err
354 }
355 switch self.t {
356 case _V_NUMBER : return self.toNumber() , nil
357 case _V_ANY :
358 if v, ok := self.packAny().(json.Number); ok {
359 return v, nil
360 } else {
361 return json.Number(""), ErrUnsupportType
362 }
363 default : return json.Number(""), ErrUnsupportType
364 }
365 }
366
367
368
369
370 func (self *Node) String() (string, error) {
371 if err := self.checkRaw(); err != nil {
372 return "", err
373 }
374 switch self.t {
375 case types.V_NULL : return "" , nil
376 case types.V_TRUE : return "true" , nil
377 case types.V_FALSE : return "false", nil
378 case types.V_STRING, _V_NUMBER : return self.toString(), nil
379 case _V_ANY :
380 any := self.packAny()
381 switch v := any.(type) {
382 case bool : return strconv.FormatBool(v), nil
383 case int : return strconv.Itoa(v), nil
384 case int8 : return strconv.Itoa(int(v)), nil
385 case int16 : return strconv.Itoa(int(v)), nil
386 case int32 : return strconv.Itoa(int(v)), nil
387 case int64 : return strconv.Itoa(int(v)), nil
388 case uint : return strconv.Itoa(int(v)), nil
389 case uint8 : return strconv.Itoa(int(v)), nil
390 case uint16 : return strconv.Itoa(int(v)), nil
391 case uint32 : return strconv.Itoa(int(v)), nil
392 case uint64 : return strconv.Itoa(int(v)), nil
393 case float32: return strconv.FormatFloat(float64(v), 'g', -1, 64), nil
394 case float64: return strconv.FormatFloat(float64(v), 'g', -1, 64), nil
395 case string : return v, nil
396 case json.Number: return v.String(), nil
397 default: return "", ErrUnsupportType
398 }
399 default : return "" , ErrUnsupportType
400 }
401 }
402
403
404
405 func (self *Node) StrictString() (string, error) {
406 if err := self.checkRaw(); err != nil {
407 return "", err
408 }
409 switch self.t {
410 case types.V_STRING : return self.toString(), nil
411 case _V_ANY :
412 if v, ok := self.packAny().(string); ok {
413 return v, nil
414 } else {
415 return "", ErrUnsupportType
416 }
417 default : return "", ErrUnsupportType
418 }
419 }
420
421
422
423
424 func (self *Node) Float64() (float64, error) {
425 if err := self.checkRaw(); err != nil {
426 return 0.0, err
427 }
428 switch self.t {
429 case _V_NUMBER, types.V_STRING : return self.toFloat64()
430 case types.V_TRUE : return 1.0, nil
431 case types.V_FALSE : return 0.0, nil
432 case types.V_NULL : return 0.0, nil
433 case _V_ANY :
434 any := self.packAny()
435 switch v := any.(type) {
436 case bool :
437 if v {
438 return 1.0, nil
439 } else {
440 return 0.0, nil
441 }
442 case int : return float64(v), nil
443 case int8 : return float64(v), nil
444 case int16 : return float64(v), nil
445 case int32 : return float64(v), nil
446 case int64 : return float64(v), nil
447 case uint : return float64(v), nil
448 case uint8 : return float64(v), nil
449 case uint16 : return float64(v), nil
450 case uint32 : return float64(v), nil
451 case uint64 : return float64(v), nil
452 case float32: return float64(v), nil
453 case float64: return float64(v), nil
454 case string :
455 if f, err := strconv.ParseFloat(v, 64); err == nil {
456 return float64(f), nil
457 } else {
458 return 0, err
459 }
460 case json.Number:
461 if f, err := v.Float64(); err == nil {
462 return float64(f), nil
463 } else {
464 return 0, err
465 }
466 default : return 0, ErrUnsupportType
467 }
468 default : return 0.0, ErrUnsupportType
469 }
470 }
471
472
473 func (self *Node) StrictFloat64() (float64, error) {
474 if err := self.checkRaw(); err != nil {
475 return 0.0, err
476 }
477 switch self.t {
478 case _V_NUMBER : return self.toFloat64()
479 case _V_ANY :
480 any := self.packAny()
481 switch v := any.(type) {
482 case float32 : return float64(v), nil
483 case float64 : return float64(v), nil
484 default : return 0, ErrUnsupportType
485 }
486 default : return 0.0, ErrUnsupportType
487 }
488 }
489
490
491
492
493
494 func (self *Node) Len() (int, error) {
495 if err := self.checkRaw(); err != nil {
496 return 0, err
497 }
498 if self.t == types.V_ARRAY || self.t == types.V_OBJECT || self.t == _V_ARRAY_LAZY || self.t == _V_OBJECT_LAZY || self.t == types.V_STRING {
499 return int(self.l), nil
500 } else if self.t == _V_NONE || self.t == types.V_NULL {
501 return 0, nil
502 } else {
503 return 0, ErrUnsupportType
504 }
505 }
506
507 func (self Node) len() int {
508 return int(self.l)
509 }
510
511
512 func (self *Node) Cap() (int, error) {
513 if err := self.checkRaw(); err != nil {
514 return 0, err
515 }
516 switch self.t {
517 case types.V_ARRAY: return (*linkedNodes)(self.p).Cap(), nil
518 case types.V_OBJECT: return (*linkedPairs)(self.p).Cap(), nil
519 case _V_ARRAY_LAZY: return (*parseArrayStack)(self.p).v.Cap(), nil
520 case _V_OBJECT_LAZY: return (*parseObjectStack)(self.p).v.Cap(), nil
521 case _V_NONE, types.V_NULL: return 0, nil
522 default: return 0, ErrUnsupportType
523 }
524 }
525
526
527
528
529 func (self *Node) Set(key string, node Node) (bool, error) {
530 if err := self.Check(); err != nil {
531 return false, err
532 }
533 if err := node.Check(); err != nil {
534 return false, err
535 }
536
537 if self.t == _V_NONE || self.t == types.V_NULL {
538 *self = NewObject([]Pair{{key, node}})
539 return false, nil
540 } else if self.itype() != types.V_OBJECT {
541 return false, ErrUnsupportType
542 }
543
544 p := self.Get(key)
545
546 if !p.Exists() {
547
548 if self.len() == 0 {
549 *self = newObject(new(linkedPairs))
550 }
551 s := (*linkedPairs)(self.p)
552 s.Push(Pair{key, node})
553 self.l++
554 return false, nil
555
556 } else if err := p.Check(); err != nil {
557 return false, err
558 }
559
560 *p = node
561 return true, nil
562 }
563
564
565 func (self *Node) SetAny(key string, val interface{}) (bool, error) {
566 return self.Set(key, NewAny(val))
567 }
568
569
570 func (self *Node) Unset(key string) (bool, error) {
571 if err := self.should(types.V_OBJECT, "an object"); err != nil {
572 return false, err
573 }
574
575 if err := self.skipAllKey(); err != nil {
576 return false, err
577 }
578 p, i := self.skipKey(key)
579 if !p.Exists() {
580 return false, nil
581 } else if err := p.Check(); err != nil {
582 return false, err
583 }
584 self.removePairAt(i)
585 return true, nil
586 }
587
588
589
590
591 func (self *Node) SetByIndex(index int, node Node) (bool, error) {
592 if err := self.Check(); err != nil {
593 return false, err
594 }
595 if err := node.Check(); err != nil {
596 return false, err
597 }
598
599 if index == 0 && (self.t == _V_NONE || self.t == types.V_NULL) {
600 *self = NewArray([]Node{node})
601 return false, nil
602 }
603
604 p := self.Index(index)
605 if !p.Exists() {
606 return false, ErrNotExist
607 } else if err := p.Check(); err != nil {
608 return false, err
609 }
610
611 *p = node
612 return true, nil
613 }
614
615
616 func (self *Node) SetAnyByIndex(index int, val interface{}) (bool, error) {
617 return self.SetByIndex(index, NewAny(val))
618 }
619
620
621
622
623
624 func (self *Node) UnsetByIndex(index int) (bool, error) {
625 if err := self.checkRaw(); err != nil {
626 return false, err
627 }
628
629 var p *Node
630 it := self.itype()
631
632 if it == types.V_ARRAY {
633 if err := self.skipAllIndex(); err != nil {
634 return false, err
635 }
636 p = self.nodeAt(index)
637 } else if it == types.V_OBJECT {
638 if err := self.skipAllKey(); err != nil {
639 return false, err
640 }
641 pr := self.pairAt(index)
642 if pr == nil {
643 return false, ErrNotExist
644 }
645 p = &pr.Value
646 } else {
647 return false, ErrUnsupportType
648 }
649
650 if !p.Exists() {
651 return false, ErrNotExist
652 }
653
654
655 if index == self.len() - 1 {
656 return true, self.Pop()
657 }
658
659
660 if it == types.V_ARRAY {
661 self.removeNode(index)
662 }else if it == types.V_OBJECT {
663 self.removePair(index)
664 }
665 return true, nil
666 }
667
668
669
670
671 func (self *Node) Add(node Node) error {
672 if err := self.Check(); err != nil {
673 return err
674 }
675
676 if self != nil && (self.t == _V_NONE || self.t == types.V_NULL) {
677 *self = NewArray([]Node{node})
678 return nil
679 }
680 if err := self.should(types.V_ARRAY, "an array"); err != nil {
681 return err
682 }
683
684 s, err := self.unsafeArray()
685 if err != nil {
686 return err
687 }
688
689
690 s.Push(node)
691 self.l++
692 return nil
693 }
694
695
696 func (self *Node) Pop() error {
697 if err := self.checkRaw(); err != nil {
698 return err
699 }
700
701 if it := self.itype(); it == types.V_ARRAY {
702 s, err := self.unsafeArray()
703 if err != nil {
704 return err
705 }
706
707 for i := s.Len()-1; i >= 0; i-- {
708 if s.At(i).Exists() {
709 s.Pop()
710 self.l--
711 break
712 }
713 s.Pop()
714 }
715
716 } else if it == types.V_OBJECT {
717 s, err := self.unsafeMap()
718 if err != nil {
719 return err
720 }
721
722 for i := s.Len()-1; i >= 0; i-- {
723 if p := s.At(i); p != nil && p.Value.Exists() {
724 s.Pop()
725 self.l--
726 break
727 }
728 s.Pop()
729 }
730
731 } else {
732 return ErrUnsupportType
733 }
734
735 return nil
736 }
737
738
739
740
741
742 func (self *Node) Move(dst, src int) error {
743 if err := self.should(types.V_ARRAY, "an array"); err != nil {
744 return err
745 }
746
747 s, err := self.unsafeArray()
748 if err != nil {
749 return err
750 }
751
752
753 if l := s.Len(); self.len() != l {
754 di, si := dst, src
755
756 for i := 0; i < l; i++ {
757 if s.At(i).Exists() {
758 di--
759 si--
760 }
761 if di == -1 {
762 dst = i
763 di--
764 }
765 if si == -1 {
766 src = i
767 si--
768 }
769 if di == -2 && si == -2 {
770 break
771 }
772 }
773 }
774
775 s.MoveOne(src, dst)
776 return nil
777 }
778
779
780 func (self *Node) AddAny(val interface{}) error {
781 return self.Add(NewAny(val))
782 }
783
784
785
786
787
788
789 func (self *Node) GetByPath(path ...interface{}) *Node {
790 if !self.Valid() {
791 return self
792 }
793 var s = self
794 for _, p := range path {
795 switch p := p.(type) {
796 case int:
797 s = s.Index(p)
798 if !s.Valid() {
799 return s
800 }
801 case string:
802 s = s.Get(p)
803 if !s.Valid() {
804 return s
805 }
806 default:
807 panic("path must be either int or string")
808 }
809 }
810 return s
811 }
812
813
814 func (self *Node) Get(key string) *Node {
815 if err := self.should(types.V_OBJECT, "an object"); err != nil {
816 return unwrapError(err)
817 }
818 n, _ := self.skipKey(key)
819 return n
820 }
821
822
823
824 func (self *Node) Index(idx int) *Node {
825 if err := self.checkRaw(); err != nil {
826 return unwrapError(err)
827 }
828
829 it := self.itype()
830 if it == types.V_ARRAY {
831 return self.skipIndex(idx)
832
833 }else if it == types.V_OBJECT {
834 pr := self.skipIndexPair(idx)
835 if pr == nil {
836 return newError(_ERR_NOT_FOUND, "value not exists")
837 }
838 return &pr.Value
839
840 } else {
841 return newError(_ERR_UNSUPPORT_TYPE, fmt.Sprintf("unsupported type: %v", self.itype()))
842 }
843 }
844
845
846
847 func (self *Node) IndexPair(idx int) *Pair {
848 if err := self.should(types.V_OBJECT, "an object"); err != nil {
849 return nil
850 }
851 return self.skipIndexPair(idx)
852 }
853
854 func (self *Node) indexOrGet(idx int, key string) (*Node, int) {
855 if err := self.should(types.V_OBJECT, "an object"); err != nil {
856 return unwrapError(err), idx
857 }
858
859 pr := self.skipIndexPair(idx)
860 if pr != nil && pr.Key == key {
861 return &pr.Value, idx
862 }
863
864 return self.skipKey(key)
865 }
866
867
868
869 func (self *Node) IndexOrGet(idx int, key string) *Node {
870 node, _ := self.indexOrGet(idx, key)
871 return node
872 }
873
874
875
876 func (self *Node) IndexOrGetWithIdx(idx int, key string) (*Node, int) {
877 return self.indexOrGet(idx, key)
878 }
879
880
881
882
883 func (self *Node) Map() (map[string]interface{}, error) {
884 if self.isAny() {
885 any := self.packAny()
886 if v, ok := any.(map[string]interface{}); ok {
887 return v, nil
888 } else {
889 return nil, ErrUnsupportType
890 }
891 }
892 if err := self.should(types.V_OBJECT, "an object"); err != nil {
893 return nil, err
894 }
895 if err := self.loadAllKey(); err != nil {
896 return nil, err
897 }
898 return self.toGenericObject()
899 }
900
901
902 func (self *Node) MapUseNumber() (map[string]interface{}, error) {
903 if self.isAny() {
904 any := self.packAny()
905 if v, ok := any.(map[string]interface{}); ok {
906 return v, nil
907 } else {
908 return nil, ErrUnsupportType
909 }
910 }
911 if err := self.should(types.V_OBJECT, "an object"); err != nil {
912 return nil, err
913 }
914 if err := self.loadAllKey(); err != nil {
915 return nil, err
916 }
917 return self.toGenericObjectUseNumber()
918 }
919
920
921
922 func (self *Node) MapUseNode() (map[string]Node, error) {
923 if self.isAny() {
924 any := self.packAny()
925 if v, ok := any.(map[string]Node); ok {
926 return v, nil
927 } else {
928 return nil, ErrUnsupportType
929 }
930 }
931 if err := self.should(types.V_OBJECT, "an object"); err != nil {
932 return nil, err
933 }
934 if err := self.skipAllKey(); err != nil {
935 return nil, err
936 }
937 return self.toGenericObjectUseNode()
938 }
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955 func (self *Node) unsafeMap() (*linkedPairs, error) {
956 if err := self.skipAllKey(); err != nil {
957 return nil, err
958 }
959 if self.p == nil {
960 *self = newObject(new(linkedPairs))
961 }
962 return (*linkedPairs)(self.p), nil
963 }
964
965
966
967 func (self *Node) SortKeys(recurse bool) error {
968
969 if err := self.checkRaw(); err != nil {
970 return err
971 }
972 if self.itype() == types.V_OBJECT {
973 return self.sortKeys(recurse)
974 } else if self.itype() == types.V_ARRAY {
975 var err error
976 err2 := self.ForEach(func(path Sequence, node *Node) bool {
977 it := node.itype()
978 if it == types.V_ARRAY || it == types.V_OBJECT {
979 err = node.SortKeys(recurse)
980 if err != nil {
981 return false
982 }
983 }
984 return true
985 })
986 if err != nil {
987 return err
988 }
989 return err2
990 } else {
991 return nil
992 }
993 }
994
995 func (self *Node) sortKeys(recurse bool) (err error) {
996
997 if err := self.checkRaw(); err != nil {
998 return err
999 }
1000 ps, err := self.unsafeMap()
1001 if err != nil {
1002 return err
1003 }
1004 ps.Sort()
1005 if recurse {
1006 var sc Scanner
1007 sc = func(path Sequence, node *Node) bool {
1008 if node.itype() == types.V_OBJECT {
1009 if err := node.sortKeys(recurse); err != nil {
1010 return false
1011 }
1012 }
1013 if node.itype() == types.V_ARRAY {
1014 if err := node.ForEach(sc); err != nil {
1015 return false
1016 }
1017 }
1018 return true
1019 }
1020 if err := self.ForEach(sc); err != nil {
1021 return err
1022 }
1023 }
1024 return nil
1025 }
1026
1027
1028 func (self *Node) Array() ([]interface{}, error) {
1029 if self.isAny() {
1030 any := self.packAny()
1031 if v, ok := any.([]interface{}); ok {
1032 return v, nil
1033 } else {
1034 return nil, ErrUnsupportType
1035 }
1036 }
1037 if err := self.should(types.V_ARRAY, "an array"); err != nil {
1038 return nil, err
1039 }
1040 if err := self.loadAllIndex(); err != nil {
1041 return nil, err
1042 }
1043 return self.toGenericArray()
1044 }
1045
1046
1047 func (self *Node) ArrayUseNumber() ([]interface{}, error) {
1048 if self.isAny() {
1049 any := self.packAny()
1050 if v, ok := any.([]interface{}); ok {
1051 return v, nil
1052 } else {
1053 return nil, ErrUnsupportType
1054 }
1055 }
1056 if err := self.should(types.V_ARRAY, "an array"); err != nil {
1057 return nil, err
1058 }
1059 if err := self.loadAllIndex(); err != nil {
1060 return nil, err
1061 }
1062 return self.toGenericArrayUseNumber()
1063 }
1064
1065
1066
1067 func (self *Node) ArrayUseNode() ([]Node, error) {
1068 if self.isAny() {
1069 any := self.packAny()
1070 if v, ok := any.([]Node); ok {
1071 return v, nil
1072 } else {
1073 return nil, ErrUnsupportType
1074 }
1075 }
1076 if err := self.should(types.V_ARRAY, "an array"); err != nil {
1077 return nil, err
1078 }
1079 if err := self.skipAllIndex(); err != nil {
1080 return nil, err
1081 }
1082 return self.toGenericArrayUseNode()
1083 }
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100 func (self *Node) unsafeArray() (*linkedNodes, error) {
1101 if err := self.skipAllIndex(); err != nil {
1102 return nil, err
1103 }
1104 if self.p == nil {
1105 *self = newArray(new(linkedNodes))
1106 }
1107 return (*linkedNodes)(self.p), nil
1108 }
1109
1110
1111
1112
1113 func (self *Node) Interface() (interface{}, error) {
1114 if err := self.checkRaw(); err != nil {
1115 return nil, err
1116 }
1117 switch self.t {
1118 case V_ERROR : return nil, self.Check()
1119 case types.V_NULL : return nil, nil
1120 case types.V_TRUE : return true, nil
1121 case types.V_FALSE : return false, nil
1122 case types.V_ARRAY : return self.toGenericArray()
1123 case types.V_OBJECT : return self.toGenericObject()
1124 case types.V_STRING : return self.toString(), nil
1125 case _V_NUMBER :
1126 v, err := self.toFloat64()
1127 if err != nil {
1128 return nil, err
1129 }
1130 return v, nil
1131 case _V_ARRAY_LAZY :
1132 if err := self.loadAllIndex(); err != nil {
1133 return nil, err
1134 }
1135 return self.toGenericArray()
1136 case _V_OBJECT_LAZY :
1137 if err := self.loadAllKey(); err != nil {
1138 return nil, err
1139 }
1140 return self.toGenericObject()
1141 case _V_ANY:
1142 switch v := self.packAny().(type) {
1143 case Node : return v.Interface()
1144 case *Node: return v.Interface()
1145 default : return v, nil
1146 }
1147 default : return nil, ErrUnsupportType
1148 }
1149 }
1150
1151 func (self *Node) packAny() interface{} {
1152 return *(*interface{})(self.p)
1153 }
1154
1155
1156
1157 func (self *Node) InterfaceUseNumber() (interface{}, error) {
1158 if err := self.checkRaw(); err != nil {
1159 return nil, err
1160 }
1161 switch self.t {
1162 case V_ERROR : return nil, self.Check()
1163 case types.V_NULL : return nil, nil
1164 case types.V_TRUE : return true, nil
1165 case types.V_FALSE : return false, nil
1166 case types.V_ARRAY : return self.toGenericArrayUseNumber()
1167 case types.V_OBJECT : return self.toGenericObjectUseNumber()
1168 case types.V_STRING : return self.toString(), nil
1169 case _V_NUMBER : return self.toNumber(), nil
1170 case _V_ARRAY_LAZY :
1171 if err := self.loadAllIndex(); err != nil {
1172 return nil, err
1173 }
1174 return self.toGenericArrayUseNumber()
1175 case _V_OBJECT_LAZY :
1176 if err := self.loadAllKey(); err != nil {
1177 return nil, err
1178 }
1179 return self.toGenericObjectUseNumber()
1180 case _V_ANY : return self.packAny(), nil
1181 default : return nil, ErrUnsupportType
1182 }
1183 }
1184
1185
1186
1187 func (self *Node) InterfaceUseNode() (interface{}, error) {
1188 if err := self.checkRaw(); err != nil {
1189 return nil, err
1190 }
1191 switch self.t {
1192 case types.V_ARRAY : return self.toGenericArrayUseNode()
1193 case types.V_OBJECT : return self.toGenericObjectUseNode()
1194 case _V_ARRAY_LAZY :
1195 if err := self.skipAllIndex(); err != nil {
1196 return nil, err
1197 }
1198 return self.toGenericArrayUseNode()
1199 case _V_OBJECT_LAZY :
1200 if err := self.skipAllKey(); err != nil {
1201 return nil, err
1202 }
1203 return self.toGenericObjectUseNode()
1204 default : return *self, self.Check()
1205 }
1206 }
1207
1208
1209
1210 func (self *Node) LoadAll() error {
1211 if self.IsRaw() {
1212 self.parseRaw(true)
1213 return self.Check()
1214 }
1215
1216 switch self.itype() {
1217 case types.V_ARRAY:
1218 e := self.len()
1219 if err := self.loadAllIndex(); err != nil {
1220 return err
1221 }
1222 for i := 0; i < e; i++ {
1223 n := self.nodeAt(i)
1224 if n.IsRaw() {
1225 n.parseRaw(true)
1226 }
1227 if err := n.Check(); err != nil {
1228 return err
1229 }
1230 }
1231 return nil
1232 case types.V_OBJECT:
1233 e := self.len()
1234 if err := self.loadAllKey(); err != nil {
1235 return err
1236 }
1237 for i := 0; i < e; i++ {
1238 n := self.pairAt(i)
1239 if n.Value.IsRaw() {
1240 n.Value.parseRaw(true)
1241 }
1242 if err := n.Value.Check(); err != nil {
1243 return err
1244 }
1245 }
1246 return nil
1247 default:
1248 return self.Check()
1249 }
1250 }
1251
1252
1253
1254 func (self *Node) Load() error {
1255 if err := self.checkRaw(); err != nil {
1256 return err
1257 }
1258
1259 switch self.t {
1260 case _V_ARRAY_LAZY:
1261 return self.skipAllIndex()
1262 case _V_OBJECT_LAZY:
1263 return self.skipAllKey()
1264 default:
1265 return self.Check()
1266 }
1267 }
1268
1269
1270
1271 func (self *Node) should(t types.ValueType, s string) error {
1272 if err := self.checkRaw(); err != nil {
1273 return err
1274 }
1275 if self.itype() != t {
1276 return ErrUnsupportType
1277 }
1278 return nil
1279 }
1280
1281 func (self *Node) nodeAt(i int) *Node {
1282 var p *linkedNodes
1283 if self.isLazy() {
1284 _, stack := self.getParserAndArrayStack()
1285 p = &stack.v
1286 } else {
1287 p = (*linkedNodes)(self.p)
1288 if l := p.Len(); l != self.len() {
1289
1290 for j:=0; j<l; j++ {
1291 v := p.At(j)
1292 if v.Exists() {
1293 i--
1294 }
1295 if i < 0 {
1296 return v
1297 }
1298 }
1299 return nil
1300 }
1301 }
1302 return p.At(i)
1303 }
1304
1305 func (self *Node) pairAt(i int) *Pair {
1306 var p *linkedPairs
1307 if self.isLazy() {
1308 _, stack := self.getParserAndObjectStack()
1309 p = &stack.v
1310 } else {
1311 p = (*linkedPairs)(self.p)
1312 if l := p.Len(); l != self.len() {
1313
1314 for j:=0; j<l; j++ {
1315 v := p.At(j)
1316 if v != nil && v.Value.Exists() {
1317 i--
1318 }
1319 if i < 0 {
1320 return v
1321 }
1322 }
1323 return nil
1324 }
1325 }
1326 return p.At(i)
1327 }
1328
1329 func (self *Node) skipAllIndex() error {
1330 if !self.isLazy() {
1331 return nil
1332 }
1333 var err types.ParsingError
1334 parser, stack := self.getParserAndArrayStack()
1335 parser.skipValue = true
1336 parser.noLazy = true
1337 *self, err = parser.decodeArray(&stack.v)
1338 if err != 0 {
1339 return parser.ExportError(err)
1340 }
1341 return nil
1342 }
1343
1344 func (self *Node) skipAllKey() error {
1345 if !self.isLazy() {
1346 return nil
1347 }
1348 var err types.ParsingError
1349 parser, stack := self.getParserAndObjectStack()
1350 parser.skipValue = true
1351 parser.noLazy = true
1352 *self, err = parser.decodeObject(&stack.v)
1353 if err != 0 {
1354 return parser.ExportError(err)
1355 }
1356 return nil
1357 }
1358
1359 func (self *Node) skipKey(key string) (*Node, int) {
1360 nb := self.len()
1361 lazy := self.isLazy()
1362
1363 if nb > 0 {
1364
1365 var p *Pair
1366 var i int
1367 if lazy {
1368 s := (*parseObjectStack)(self.p)
1369 p, i = s.v.Get(key)
1370 } else {
1371 p, i = (*linkedPairs)(self.p).Get(key)
1372 }
1373
1374 if p != nil {
1375 return &p.Value, i
1376 }
1377 }
1378
1379
1380 if !lazy {
1381 return nil, -1
1382 }
1383
1384
1385 for last, i := self.skipNextPair(), nb; last != nil; last, i = self.skipNextPair(), i+1 {
1386 if last.Value.Check() != nil {
1387 return &last.Value, -1
1388 }
1389 if last.Key == key {
1390 return &last.Value, i
1391 }
1392 }
1393
1394 return nil, -1
1395 }
1396
1397 func (self *Node) skipIndex(index int) *Node {
1398 nb := self.len()
1399 if nb > index {
1400 v := self.nodeAt(index)
1401 return v
1402 }
1403 if !self.isLazy() {
1404 return nil
1405 }
1406
1407
1408 for last := self.skipNextNode(); last != nil; last = self.skipNextNode(){
1409 if last.Check() != nil {
1410 return last
1411 }
1412 if self.len() > index {
1413 return last
1414 }
1415 }
1416
1417 return nil
1418 }
1419
1420 func (self *Node) skipIndexPair(index int) *Pair {
1421 nb := self.len()
1422 if nb > index {
1423 return self.pairAt(index)
1424 }
1425 if !self.isLazy() {
1426 return nil
1427 }
1428
1429
1430 for last := self.skipNextPair(); last != nil; last = self.skipNextPair(){
1431 if last.Value.Check() != nil {
1432 return last
1433 }
1434 if self.len() > index {
1435 return last
1436 }
1437 }
1438
1439 return nil
1440 }
1441
1442 func (self *Node) loadAllIndex() error {
1443 if !self.isLazy() {
1444 return nil
1445 }
1446 var err types.ParsingError
1447 parser, stack := self.getParserAndArrayStack()
1448 parser.noLazy = true
1449 *self, err = parser.decodeArray(&stack.v)
1450 if err != 0 {
1451 return parser.ExportError(err)
1452 }
1453 return nil
1454 }
1455
1456 func (self *Node) loadAllKey() error {
1457 if !self.isLazy() {
1458 return nil
1459 }
1460 var err types.ParsingError
1461 parser, stack := self.getParserAndObjectStack()
1462 parser.noLazy = true
1463 *self, err = parser.decodeObject(&stack.v)
1464 if err != 0 {
1465 return parser.ExportError(err)
1466 }
1467 return nil
1468 }
1469
1470 func (self *Node) removeNode(i int) {
1471 node := self.nodeAt(i)
1472 if node == nil {
1473 return
1474 }
1475 *node = Node{}
1476
1477 self.l--
1478 }
1479
1480 func (self *Node) removePair(i int) {
1481 last := self.pairAt(i)
1482 if last == nil {
1483 return
1484 }
1485 *last = Pair{}
1486
1487 self.l--
1488 }
1489
1490 func (self *Node) removePairAt(i int) {
1491 p := (*linkedPairs)(self.p).At(i)
1492 if p == nil {
1493 return
1494 }
1495 *p = Pair{}
1496
1497 self.l--
1498 }
1499
1500 func (self *Node) toGenericArray() ([]interface{}, error) {
1501 nb := self.len()
1502 if nb == 0 {
1503 return []interface{}{}, nil
1504 }
1505 ret := make([]interface{}, 0, nb)
1506
1507
1508 it := self.values()
1509 for v := it.next(); v != nil; v = it.next() {
1510 vv, err := v.Interface()
1511 if err != nil {
1512 return nil, err
1513 }
1514 ret = append(ret, vv)
1515 }
1516
1517
1518 return ret, nil
1519 }
1520
1521 func (self *Node) toGenericArrayUseNumber() ([]interface{}, error) {
1522 nb := self.len()
1523 if nb == 0 {
1524 return []interface{}{}, nil
1525 }
1526 ret := make([]interface{}, 0, nb)
1527
1528
1529 it := self.values()
1530 for v := it.next(); v != nil; v = it.next() {
1531 vv, err := v.InterfaceUseNumber()
1532 if err != nil {
1533 return nil, err
1534 }
1535 ret = append(ret, vv)
1536 }
1537
1538
1539 return ret, nil
1540 }
1541
1542 func (self *Node) toGenericArrayUseNode() ([]Node, error) {
1543 var nb = self.len()
1544 if nb == 0 {
1545 return []Node{}, nil
1546 }
1547
1548 var s = (*linkedNodes)(self.p)
1549 var out = make([]Node, nb)
1550 s.ToSlice(out)
1551
1552 return out, nil
1553 }
1554
1555 func (self *Node) toGenericObject() (map[string]interface{}, error) {
1556 nb := self.len()
1557 if nb == 0 {
1558 return map[string]interface{}{}, nil
1559 }
1560 ret := make(map[string]interface{}, nb)
1561
1562
1563 it := self.properties()
1564 for v := it.next(); v != nil; v = it.next() {
1565 vv, err := v.Value.Interface()
1566 if err != nil {
1567 return nil, err
1568 }
1569 ret[v.Key] = vv
1570 }
1571
1572
1573 return ret, nil
1574 }
1575
1576
1577 func (self *Node) toGenericObjectUseNumber() (map[string]interface{}, error) {
1578 nb := self.len()
1579 if nb == 0 {
1580 return map[string]interface{}{}, nil
1581 }
1582 ret := make(map[string]interface{}, nb)
1583
1584
1585 it := self.properties()
1586 for v := it.next(); v != nil; v = it.next() {
1587 vv, err := v.Value.InterfaceUseNumber()
1588 if err != nil {
1589 return nil, err
1590 }
1591 ret[v.Key] = vv
1592 }
1593
1594
1595 return ret, nil
1596 }
1597
1598 func (self *Node) toGenericObjectUseNode() (map[string]Node, error) {
1599 var nb = self.len()
1600 if nb == 0 {
1601 return map[string]Node{}, nil
1602 }
1603
1604 var s = (*linkedPairs)(self.p)
1605 var out = make(map[string]Node, nb)
1606 s.ToMap(out)
1607
1608
1609 return out, nil
1610 }
1611
1612
1613
1614 var (
1615 nullNode = Node{t: types.V_NULL}
1616 trueNode = Node{t: types.V_TRUE}
1617 falseNode = Node{t: types.V_FALSE}
1618 )
1619
1620
1621
1622 func NewRaw(json string) Node {
1623 parser := NewParserObj(json)
1624 start, err := parser.skip()
1625 if err != 0 {
1626 return *newError(err, err.Message())
1627 }
1628 it := switchRawType(parser.s[start])
1629 if it == _V_NONE {
1630 return Node{}
1631 }
1632 return newRawNode(parser.s[start:parser.p], it)
1633 }
1634
1635
1636
1637 func NewAny(any interface{}) Node {
1638 switch n := any.(type) {
1639 case Node:
1640 return n
1641 case *Node:
1642 return *n
1643 default:
1644 return Node{
1645 t: _V_ANY,
1646 p: unsafe.Pointer(&any),
1647 }
1648 }
1649 }
1650
1651
1652 func NewBytes(src []byte) Node {
1653 if len(src) == 0 {
1654 panic("empty src bytes")
1655 }
1656 out := encodeBase64(src)
1657 return NewString(out)
1658 }
1659
1660
1661 func NewNull() Node {
1662 return Node{
1663 p: nil,
1664 t: types.V_NULL,
1665 }
1666 }
1667
1668
1669
1670
1671 func NewBool(v bool) Node {
1672 var t = types.V_FALSE
1673 if v {
1674 t = types.V_TRUE
1675 }
1676 return Node{
1677 p: nil,
1678 t: t,
1679 }
1680 }
1681
1682
1683
1684 func NewNumber(v string) Node {
1685 return Node{
1686 l: uint(len(v)),
1687 p: rt.StrPtr(v),
1688 t: _V_NUMBER,
1689 }
1690 }
1691
1692 func (node Node) toNumber() json.Number {
1693 return json.Number(rt.StrFrom(node.p, int64(node.l)))
1694 }
1695
1696 func (self Node) toString() string {
1697 return rt.StrFrom(self.p, int64(self.l))
1698 }
1699
1700 func (node Node) toFloat64() (float64, error) {
1701 ret, err := node.toNumber().Float64()
1702 if err != nil {
1703 return 0, err
1704 }
1705 return ret, nil
1706 }
1707
1708 func (node Node) toInt64() (int64, error) {
1709 ret,err := node.toNumber().Int64()
1710 if err != nil {
1711 return 0, err
1712 }
1713 return ret, nil
1714 }
1715
1716 func newBytes(v []byte) Node {
1717 return Node{
1718 t: types.V_STRING,
1719 p: mem2ptr(v),
1720 l: uint(len(v)),
1721 }
1722 }
1723
1724
1725
1726
1727
1728 func NewString(v string) Node {
1729 return Node{
1730 t: types.V_STRING,
1731 p: rt.StrPtr(v),
1732 l: uint(len(v)),
1733 }
1734 }
1735
1736
1737
1738 func NewArray(v []Node) Node {
1739 s := new(linkedNodes)
1740 s.FromSlice(v)
1741 return newArray(s)
1742 }
1743
1744 func newArray(v *linkedNodes) Node {
1745 return Node{
1746 t: types.V_ARRAY,
1747 l: uint(v.Len()),
1748 p: unsafe.Pointer(v),
1749 }
1750 }
1751
1752 func (self *Node) setArray(v *linkedNodes) {
1753 self.t = types.V_ARRAY
1754 self.l = uint(v.Len())
1755 self.p = unsafe.Pointer(v)
1756 }
1757
1758
1759
1760 func NewObject(v []Pair) Node {
1761 s := new(linkedPairs)
1762 s.FromSlice(v)
1763 return newObject(s)
1764 }
1765
1766 func newObject(v *linkedPairs) Node {
1767 return Node{
1768 t: types.V_OBJECT,
1769 l: uint(v.Len()),
1770 p: unsafe.Pointer(v),
1771 }
1772 }
1773
1774 func (self *Node) setObject(v *linkedPairs) {
1775 self.t = types.V_OBJECT
1776 self.l = uint(v.Len())
1777 self.p = unsafe.Pointer(v)
1778 }
1779
1780 func newRawNode(str string, typ types.ValueType) Node {
1781 return Node{
1782 t: _V_RAW | typ,
1783 p: rt.StrPtr(str),
1784 l: uint(len(str)),
1785 }
1786 }
1787
1788 func (self *Node) parseRaw(full bool) {
1789 raw := self.toString()
1790 parser := NewParserObj(raw)
1791 if full {
1792 parser.noLazy = true
1793 parser.skipValue = false
1794 }
1795 var e types.ParsingError
1796 *self, e = parser.Parse()
1797 if e != 0 {
1798 *self = *newSyntaxError(parser.syntaxError(e))
1799 }
1800 }
1801
1802 var typeJumpTable = [256]types.ValueType{
1803 '"' : types.V_STRING,
1804 '-' : _V_NUMBER,
1805 '0' : _V_NUMBER,
1806 '1' : _V_NUMBER,
1807 '2' : _V_NUMBER,
1808 '3' : _V_NUMBER,
1809 '4' : _V_NUMBER,
1810 '5' : _V_NUMBER,
1811 '6' : _V_NUMBER,
1812 '7' : _V_NUMBER,
1813 '8' : _V_NUMBER,
1814 '9' : _V_NUMBER,
1815 '[' : types.V_ARRAY,
1816 'f' : types.V_FALSE,
1817 'n' : types.V_NULL,
1818 't' : types.V_TRUE,
1819 '{' : types.V_OBJECT,
1820 }
1821
1822 func switchRawType(c byte) types.ValueType {
1823 return typeJumpTable[c]
1824 }
1825
View as plain text