14
type varParser struct {
19
func (p *varParser) backup() {
23
func (p *varParser) next() varToken {
24
if p.i < len(p.tokens) {
29
return varToken{typ: tokEOF}
32
type varNode interface {
33
Infer() (Signature, error)
36
Value(Signature) (interface{}, error)
39
func varMakeNode(p *varParser) (varNode, error) {
46
return nil, io.ErrUnexpectedEOF
48
return nil, errors.New(t.val)
50
return varMakeNumNode(t, sig)
52
return varMakeStringNode(t, sig)
54
if sig.str != "" && sig.str != "b" {
55
return nil, varTypeError{t.val, sig}
57
b, err := strconv.ParseBool(t.val)
61
return boolNode(b), nil
63
return varMakeArrayNode(p, sig)
65
return varMakeVariantNode(p, sig)
67
return varMakeDictNode(p, sig)
70
return nil, errors.New("unexpected type annotation")
75
sig.str = varTypeMap[t.val]
78
if sig.str != "" && sig.str != "ay" {
79
return nil, varTypeError{t.val, sig}
81
b, err := varParseByteString(t.val)
85
return byteStringNode(b), nil
87
return nil, fmt.Errorf("unexpected %q", t.val)
92
type varTypeError struct {
97
func (e varTypeError) Error() string {
98
return fmt.Sprintf("dbus: can't parse %q as type %q", e.val, e.sig.str)
101
type sigSet map[Signature]bool
103
func (s sigSet) Empty() bool {
107
func (s sigSet) Intersect(s2 sigSet) sigSet {
117
func (s sigSet) Single() (Signature, bool) {
123
return Signature{}, false
126
func (s sigSet) ToArray() sigSet {
127
r := make(sigSet, len(s))
129
r[Signature{"a" + k.str}] = true
134
type numNode struct {
140
var numSigSet = sigSet{
141
Signature{"y"}: true,
142
Signature{"n"}: true,
143
Signature{"q"}: true,
144
Signature{"i"}: true,
145
Signature{"u"}: true,
146
Signature{"x"}: true,
147
Signature{"t"}: true,
148
Signature{"d"}: true,
151
func (n numNode) Infer() (Signature, error) {
152
if strings.ContainsAny(n.str, ".e") {
153
return Signature{"d"}, nil
155
return Signature{"i"}, nil
158
func (n numNode) String() string {
162
func (n numNode) Sigs() sigSet {
164
return sigSet{n.sig: true}
166
if strings.ContainsAny(n.str, ".e") {
167
return sigSet{Signature{"d"}: true}
172
func (n numNode) Value(sig Signature) (interface{}, error) {
173
if n.sig.str != "" && n.sig != sig {
174
return nil, varTypeError{n.str, sig}
179
return varNumAs(n.str, sig)
182
func varMakeNumNode(tok varToken, sig Signature) (varNode, error) {
184
return numNode{str: tok.val}, nil
186
num, err := varNumAs(tok.val, sig)
190
return numNode{sig: sig, val: num}, nil
193
func varNumAs(s string, sig Signature) (interface{}, error) {
214
d, err := strconv.ParseFloat(s, 64)
220
return nil, varTypeError{s, sig}
223
if strings.HasPrefix(s, "0x") {
227
if strings.HasPrefix(s, "0") && len(s) != 1 {
232
i, err := strconv.ParseUint(s, base, size)
236
var v interface{} = i
247
i, err := strconv.ParseInt(s, base, size)
251
var v interface{} = i
261
type stringNode struct {
264
val interface{} // has correct type
267
var stringSigSet = sigSet{
268
Signature{"s"}: true,
269
Signature{"g"}: true,
270
Signature{"o"}: true,
273
func (n stringNode) Infer() (Signature, error) {
274
return Signature{"s"}, nil
277
func (n stringNode) String() string {
281
func (n stringNode) Sigs() sigSet {
283
return sigSet{n.sig: true}
288
func (n stringNode) Value(sig Signature) (interface{}, error) {
289
if n.sig.str != "" && n.sig != sig {
290
return nil, varTypeError{n.str, sig}
297
return Signature{n.str}, nil
299
return ObjectPath(n.str), nil
303
return nil, varTypeError{n.str, sig}
307
func varMakeStringNode(tok varToken, sig Signature) (varNode, error) {
308
if sig.str != "" && sig.str != "s" && sig.str != "g" && sig.str != "o" {
309
return nil, fmt.Errorf("invalid type %q for string", sig.str)
311
s, err := varParseString(tok.val)
315
n := stringNode{str: s}
317
return stringNode{str: s}, nil
322
n.val = ObjectPath(s)
331
func varParseString(s string) (string, error) {
332
// quotes are guaranteed to be there
334
buf := new(bytes.Buffer)
336
r, size := utf8.DecodeRuneInString(s)
337
if r == utf8.RuneError && size == 1 {
338
return "", errors.New("invalid UTF-8")
345
r, size = utf8.DecodeRuneInString(s)
346
if r == utf8.RuneError && size == 1 {
347
return "", errors.New("invalid UTF-8")
366
return "", errors.New("short unicode escape")
368
r, err := strconv.ParseUint(s[:4], 16, 32)
372
buf.WriteRune(rune(r))
376
return "", errors.New("short unicode escape")
378
r, err := strconv.ParseUint(s[:8], 16, 32)
382
buf.WriteRune(rune(r))
388
return buf.String(), nil
391
var boolSigSet = sigSet{Signature{"b"}: true}
395
func (boolNode) Infer() (Signature, error) {
396
return Signature{"b"}, nil
399
func (b boolNode) String() string {
406
func (boolNode) Sigs() sigSet {
410
func (b boolNode) Value(sig Signature) (interface{}, error) {
412
return nil, varTypeError{b.String(), sig}
417
type arrayNode struct {
423
func (n arrayNode) Infer() (Signature, error) {
424
for _, v := range n.children {
425
csig, err := varInfer(v)
429
return Signature{"a" + csig.str}, nil
431
return Signature{}, fmt.Errorf("can't infer type for %q", n.String())
434
func (n arrayNode) String() string {
436
for i, v := range n.children {
438
if i != len(n.children)-1 {
445
func (n arrayNode) Sigs() sigSet {
449
func (n arrayNode) Value(sig Signature) (interface{}, error) {
451
// no type information whatsoever, so this must be an empty slice
452
return reflect.MakeSlice(typeFor(sig.str), 0, 0).Interface(), nil
455
return nil, varTypeError{n.String(), sig}
457
s := reflect.MakeSlice(typeFor(sig.str), len(n.children), len(n.children))
458
for i, v := range n.children {
459
rv, err := v.Value(Signature{sig.str[1:]})
463
s.Index(i).Set(reflect.ValueOf(rv))
465
return s.Interface(), nil
468
func varMakeArrayNode(p *varParser, sig Signature) (varNode, error) {
471
n.set = sigSet{sig: true}
473
if t := p.next(); t.typ == tokArrayEnd {
483
return nil, io.ErrUnexpectedEOF
485
return nil, errors.New(t.val)
488
cn, err := varMakeNode(p)
492
if cset := cn.Sigs(); !cset.Empty() {
494
n.set = cset.ToArray()
496
nset := cset.ToArray().Intersect(n.set)
498
return nil, fmt.Errorf("can't parse %q with given type information", cn.String())
503
n.children = append(n.children, cn)
504
switch t := p.next(); t.typ {
506
return nil, io.ErrUnexpectedEOF
508
return nil, errors.New(t.val)
514
return nil, fmt.Errorf("unexpected %q", t.val)
520
type variantNode struct {
524
var variantSet = sigSet{
525
Signature{"v"}: true,
528
func (variantNode) Infer() (Signature, error) {
529
return Signature{"v"}, nil
532
func (n variantNode) String() string {
533
return "<" + n.n.String() + ">"
536
func (variantNode) Sigs() sigSet {
540
func (n variantNode) Value(sig Signature) (interface{}, error) {
542
return nil, varTypeError{n.String(), sig}
544
sig, err := varInfer(n.n)
548
v, err := n.n.Value(sig)
552
return MakeVariant(v), nil
555
func varMakeVariantNode(p *varParser, sig Signature) (varNode, error) {
556
n, err := varMakeNode(p)
560
if t := p.next(); t.typ != tokVariantEnd {
561
return nil, fmt.Errorf("unexpected %q", t.val)
564
if sig.str != "" && sig.str != "v" {
565
return nil, varTypeError{vn.String(), sig}
567
return variantNode{n}, nil
570
type dictEntry struct {
574
type dictNode struct {
580
func (n dictNode) Infer() (Signature, error) {
581
for _, v := range n.children {
582
ksig, err := varInfer(v.key)
586
vsig, err := varInfer(v.val)
590
return Signature{"a{" + ksig.str + vsig.str + "}"}, nil
592
return Signature{}, fmt.Errorf("can't infer type for %q", n.String())
595
func (n dictNode) String() string {
597
for i, v := range n.children {
598
s += v.key.String() + ": " + v.val.String()
599
if i != len(n.children)-1 {
606
func (n dictNode) Sigs() sigSet {
608
for k := range n.kset {
609
for v := range n.vset {
610
sig := "a{" + k.str + v.str + "}"
611
r[Signature{sig}] = true
617
func (n dictNode) Value(sig Signature) (interface{}, error) {
620
// no type information -> empty dict
621
return reflect.MakeMap(typeFor(sig.str)).Interface(), nil
624
return nil, varTypeError{n.String(), sig}
626
m := reflect.MakeMap(typeFor(sig.str))
627
ksig := Signature{sig.str[2:3]}
628
vsig := Signature{sig.str[3 : len(sig.str)-1]}
629
for _, v := range n.children {
630
kv, err := v.key.Value(ksig)
634
vv, err := v.val.Value(vsig)
638
m.SetMapIndex(reflect.ValueOf(kv), reflect.ValueOf(vv))
640
return m.Interface(), nil
643
func varMakeDictNode(p *varParser, sig Signature) (varNode, error) {
647
if len(sig.str) < 5 {
648
return nil, fmt.Errorf("invalid signature %q for dict type", sig)
650
ksig := Signature{string(sig.str[2])}
651
vsig := Signature{sig.str[3 : len(sig.str)-1]}
652
n.kset = sigSet{ksig: true}
653
n.vset = sigSet{vsig: true}
655
if t := p.next(); t.typ == tokDictEnd {
665
return nil, io.ErrUnexpectedEOF
667
return nil, errors.New(t.val)
670
kn, err := varMakeNode(p)
674
if kset := kn.Sigs(); !kset.Empty() {
678
n.kset = kset.Intersect(n.kset)
680
return nil, fmt.Errorf("can't parse %q with given type information", kn.String())
687
return nil, io.ErrUnexpectedEOF
689
return nil, errors.New(t.val)
692
return nil, fmt.Errorf("unexpected %q", t.val)
697
return nil, io.ErrUnexpectedEOF
699
return nil, errors.New(t.val)
702
vn, err := varMakeNode(p)
706
if vset := vn.Sigs(); !vset.Empty() {
710
n.vset = n.vset.Intersect(vset)
712
return nil, fmt.Errorf("can't parse %q with given type information", vn.String())
716
n.children = append(n.children, dictEntry{kn, vn})
720
return nil, io.ErrUnexpectedEOF
722
return nil, errors.New(t.val)
728
return nil, fmt.Errorf("unexpected %q", t.val)
734
type byteStringNode []byte
736
var byteStringSet = sigSet{
737
Signature{"ay"}: true,
740
func (byteStringNode) Infer() (Signature, error) {
741
return Signature{"ay"}, nil
744
func (b byteStringNode) String() string {
748
func (b byteStringNode) Sigs() sigSet {
752
func (b byteStringNode) Value(sig Signature) (interface{}, error) {
754
return nil, varTypeError{b.String(), sig}
756
return []byte(b), nil
759
func varParseByteString(s string) ([]byte, error) {
760
// quotes and b at start are guaranteed to be there
761
b := make([]byte, 0, 1)
787
return nil, errors.New("short escape")
789
n, err := strconv.ParseUint(s[:2], 16, 8)
793
b = append(b, byte(n))
797
return nil, errors.New("short escape")
799
n, err := strconv.ParseUint(s[:3], 8, 8)
803
b = append(b, byte(n))
809
return append(b, 0), nil
812
func varInfer(n varNode) (Signature, error) {
813
if sig, ok := n.Sigs().Single(); ok {