-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmessage.go
More file actions
73 lines (60 loc) · 1.42 KB
/
message.go
File metadata and controls
73 lines (60 loc) · 1.42 KB
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
package scratchgo
import (
"regexp"
_ "strconv"
"strings"
)
const regexParam = `\s+(?:\"((?:\\"|[^\"])*)\"?|([^\"]\S*))`
var (
types = []string{"broadcast", "sensor-update"}
trimValues = []string{" ", "\""}
)
type Message struct {
Type string // sensor-update | broadcast
Variables map[string]string
}
func ParseMessage(message string) *Message {
type_name := strings.Split(message, " ")[0]
message = message[len(type_name):]
var parse func(string) map[string]string
if type_name == "broadcast" {
parse = parseBroadcast
} else if type_name == "sensor-update" {
parse = parseSensorupdate
}
return &Message{type_name, parse(message)}
}
func parseBroadcast(message string) map[string]string {
cmd := trim(message, trimValues)
return map[string]string{"command": cmd}
}
func parseSensorupdate(message string) map[string]string {
ret := make(map[string]string)
words := regexp.MustCompile(regexParam).FindAllString(message, -1)
var key string
for index, word := range words {
word := trim(word, trimValues)
if index%2 == 0 {
key = word
continue
}
ret[key] = word
}
return ret
}
func trim(text string, trm []string) string {
ret := text
for _, t := range trm {
ret = strings.Trim(ret, t)
}
return ret
}
func (self *Message) GetNames() []string {
ret := make([]string, len(self.Variables))
var index int = 0
for k, _ := range self.Variables {
ret[index] = k
index++
}
return ret
}