File: match_rule.go

package info (click to toggle)
go-dlib 5.6.0.9%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,212 kB
  • sloc: ansic: 4,664; xml: 1,456; makefile: 20; sh: 15
file content (126 lines) | stat: -rw-r--r-- 2,897 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package dbusutil

import (
	"bytes"
	"fmt"

	"github.com/godbus/dbus"
)

type MatchRule struct {
	Str string
}

func (mr MatchRule) AddTo(conn *dbus.Conn) error {
	return conn.BusObject().Call(orgFreedesktopDBus+".AddMatch", 0, mr.Str).Err
}

func (mr MatchRule) RemoveFrom(conn *dbus.Conn) error {
	return conn.BusObject().Call(orgFreedesktopDBus+".RemoveMatch", 0, mr.Str).Err
}

type matchRuleItem struct {
	key, value string
}

type MatchRuleBuilder struct {
	items []matchRuleItem
}

func (b *MatchRuleBuilder) addItem(k, v string) {
	b.items = append(b.items, matchRuleItem{k, v})
}

func NewMatchRuleBuilder() *MatchRuleBuilder {
	return &MatchRuleBuilder{}
}

func (b *MatchRuleBuilder) Type(type0 string) *MatchRuleBuilder {
	b.addItem("type", type0)
	return b
}

func (b *MatchRuleBuilder) Path(path string) *MatchRuleBuilder {
	b.addItem("path", path)
	return b
}

func (b *MatchRuleBuilder) Sender(sender string) *MatchRuleBuilder {
	b.addItem("sender", sender)
	return b
}

func (b *MatchRuleBuilder) Interface(interface0 string) *MatchRuleBuilder {
	b.addItem("interface", interface0)
	return b
}

func (b *MatchRuleBuilder) Member(member string) *MatchRuleBuilder {
	b.addItem("member", member)
	return b
}

func (b *MatchRuleBuilder) PathNamespace(pathNamespace string) *MatchRuleBuilder {
	b.addItem("path_namespace", pathNamespace)
	return b
}

func (b *MatchRuleBuilder) Destination(destination string) *MatchRuleBuilder {
	b.addItem("destination", destination)
	return b
}

func (b *MatchRuleBuilder) Eavesdrop(eavesdrop bool) *MatchRuleBuilder {
	val := "false"
	if eavesdrop {
		val = "true"
	}
	b.addItem("eavesdrop", val)
	return b
}

func (b *MatchRuleBuilder) Arg(idx int, value string) *MatchRuleBuilder {
	b.addItem(fmt.Sprintf("arg%d", idx), value)
	return b
}

func (b *MatchRuleBuilder) ArgPath(idx int, path string) *MatchRuleBuilder {
	b.addItem(fmt.Sprintf("arg%dpath", idx), path)
	return b
}

func (b *MatchRuleBuilder) ArgNamespace(idx int, namespace string) *MatchRuleBuilder {
	b.addItem(fmt.Sprintf("arg%dnamespace", idx), namespace)
	return b
}

func (b *MatchRuleBuilder) ExtPropertiesChanged(path, interfaceName string) *MatchRuleBuilder {
	return b.Type("signal").
		Path(path).
		Interface(orgFreedesktopDBus+".Properties").
		Member("PropertiesChanged").
		ArgNamespace(0, interfaceName)
}

func (b *MatchRuleBuilder) ExtSignal(path, interfaceName, name string) *MatchRuleBuilder {
	return b.Type("signal").
		Path(path).
		Interface(interfaceName).
		Member(name)
}

func (b *MatchRuleBuilder) BuildStr() string {
	var buf bytes.Buffer
	for _, item := range b.items {
		buf.WriteString(item.key)
		buf.Write([]byte("='"))
		buf.WriteString(item.value)
		buf.Write([]byte("',"))
	}
	data := buf.Bytes()
	return string(data[:len(data)-1]) // remove tailing comma
}

func (b *MatchRuleBuilder) Build() MatchRule {
	return MatchRule{Str: b.BuildStr()}
}