Browse Source

reorganize parsing code

tags/v0.1.0
Jeremy Latt 12 years ago
parent
commit
f2696fc1ce
2 changed files with 88 additions and 87 deletions
  1. 0
    87
      src/irc/commands.go
  2. 88
    0
      src/irc/parse.go

+ 0
- 87
src/irc/commands.go View File

@@ -1,27 +1,13 @@
1 1
 package irc
2 2
 
3
-import (
4
-	"strconv"
5
-	"strings"
6
-)
7
-
8 3
 type Message interface {
9 4
 	Handle(s *Server, c *Client)
10 5
 }
11 6
 
12
-type NewMessageFunc func([]string) Message
13
-
14 7
 type NickMessage struct {
15 8
 	nickname string
16 9
 }
17 10
 
18
-func NewNickMessage(args []string) Message {
19
-	if len(args) != 1 {
20
-		return nil
21
-	}
22
-	return &NickMessage{args[0]}
23
-}
24
-
25 11
 func (m *NickMessage) Handle(s *Server, c *Client) {
26 12
 	if s.nicks[m.nickname] != nil {
27 13
 		c.send <- ErrNickNameInUse(m.nickname)
@@ -42,21 +28,6 @@ type UserMessage struct {
42 28
 	realname string
43 29
 }
44 30
 
45
-func NewUserMessage(args []string) Message {
46
-	if len(args) != 4 {
47
-		return nil
48
-	}
49
-	msg := new(UserMessage)
50
-	msg.user = args[0]
51
-	mode, err := strconv.ParseUint(args[1], 10, 8)
52
-	if err == nil {
53
-		msg.mode = uint8(mode)
54
-	}
55
-	msg.unused = args[2]
56
-	msg.realname = args[3]
57
-	return msg
58
-}
59
-
60 31
 func (m *UserMessage) Handle(s *Server, c *Client) {
61 32
 	if c.username != "" {
62 33
 		c.send <- ErrAlreadyRegistered(c.Nick())
@@ -70,14 +41,6 @@ type QuitMessage struct {
70 41
 	message string
71 42
 }
72 43
 
73
-func NewQuitMessage(args []string) Message {
74
-	msg := QuitMessage{}
75
-	if len(args) > 0 {
76
-		msg.message = args[0]
77
-	}
78
-	return &msg
79
-}
80
-
81 44
 func (m *QuitMessage) Handle(s *Server, c *Client) {
82 45
 	c.send <- MessageError()
83 46
 	delete(s.nicks, c.nick)
@@ -93,10 +56,6 @@ func (m *UnknownMessage) Handle(s *Server, c *Client) {
93 56
 
94 57
 type PingMessage struct {}
95 58
 
96
-func NewPingMessage(args []string) Message {
97
-	return &PingMessage{}
98
-}
99
-
100 59
 func (m *PingMessage) Handle(s *Server, c *Client) {
101 60
 	c.send <- MessagePong()
102 61
 }
@@ -110,49 +69,3 @@ func tryRegister(s *Server, c *Client) {
110 69
 		c.send <- ReplyMyInfo(c.Nick(), "irc.jlatt.com")
111 70
 	}
112 71
 }
113
-
114
-func parseArg(line string) (string, string) {
115
-	if line == "" {
116
-		return "", ""
117
-	}
118
-
119
-	if strings.HasPrefix(line, ":") {
120
-		return line[1:], ""
121
-	}
122
-
123
-	parts := strings.SplitN(line, " ", 2)
124
-	arg := parts[0]
125
-	rest := ""
126
-	if len(parts) > 1 {
127
-		rest = parts[1]
128
-	}
129
-	return arg, rest
130
-}
131
-
132
-func parseLine(line string) (string, []string) {
133
-	args := make([]string, 0)
134
-	for arg, rest := parseArg(line); arg != ""; arg, rest = parseArg(rest) {
135
-		args = append(args, arg)
136
-	}
137
-	return args[0], args[1:]
138
-}
139
-
140
-var commands = map[string]NewMessageFunc {
141
-	"NICK": NewNickMessage,
142
-	"PING": NewPingMessage,
143
-	"QUIT": NewQuitMessage,
144
-	"USER": NewUserMessage,
145
-}
146
-
147
-func ParseMessage(line string) Message {
148
-	command, args := parseLine(line)
149
-	constructor := commands[command]
150
-	var msg Message
151
-	if constructor != nil {
152
-		msg = constructor(args)
153
-	}
154
-	if msg == nil {
155
-		msg = &UnknownMessage{command}
156
-	}
157
-	return msg
158
-}

+ 88
- 0
src/irc/parse.go View File

@@ -0,0 +1,88 @@
1
+package irc
2
+
3
+import (
4
+	"strconv"
5
+	"strings"
6
+)
7
+
8
+func parseArg(line string) (string, string) {
9
+	if line == "" {
10
+		return "", ""
11
+	}
12
+
13
+	if strings.HasPrefix(line, ":") {
14
+		return line[1:], ""
15
+	}
16
+
17
+	parts := strings.SplitN(line, " ", 2)
18
+	arg := parts[0]
19
+	rest := ""
20
+	if len(parts) > 1 {
21
+		rest = parts[1]
22
+	}
23
+	return arg, rest
24
+}
25
+
26
+func parseLine(line string) (string, []string) {
27
+	args := make([]string, 0)
28
+	for arg, rest := parseArg(line); arg != ""; arg, rest = parseArg(rest) {
29
+		args = append(args, arg)
30
+	}
31
+	return args[0], args[1:]
32
+}
33
+
34
+var commands = map[string]func([]string) Message {
35
+	"NICK": NewNickMessage,
36
+	"PING": NewPingMessage,
37
+	"QUIT": NewQuitMessage,
38
+	"USER": NewUserMessage,
39
+}
40
+
41
+func ParseMessage(line string) Message {
42
+	command, args := parseLine(line)
43
+	constructor, ok := commands[command]
44
+	var msg Message
45
+	if ok {
46
+		msg = constructor(args)
47
+	}
48
+	if msg == nil {
49
+		msg = &UnknownMessage{command}
50
+	}
51
+	return msg
52
+}
53
+
54
+// []string => Message constructors
55
+
56
+func NewNickMessage(args []string) Message {
57
+	if len(args) != 1 {
58
+		return nil
59
+	}
60
+	return &NickMessage{args[0]}
61
+}
62
+
63
+func NewPingMessage(args []string) Message {
64
+	return &PingMessage{}
65
+}
66
+
67
+func NewQuitMessage(args []string) Message {
68
+	msg := QuitMessage{}
69
+	if len(args) > 0 {
70
+		msg.message = args[0]
71
+	}
72
+	return &msg
73
+}
74
+
75
+func NewUserMessage(args []string) Message {
76
+	if len(args) != 4 {
77
+		return nil
78
+	}
79
+	msg := new(UserMessage)
80
+	msg.user = args[0]
81
+	mode, err := strconv.ParseUint(args[1], 10, 8)
82
+	if err == nil {
83
+		msg.mode = uint8(mode)
84
+	}
85
+	msg.unused = args[2]
86
+	msg.realname = args[3]
87
+	return msg
88
+}

Loading…
Cancel
Save