commit ca56268
Hubert Hirtz
·
2020-08-16 19:43:55 +0000 UTC
parent e7efe87
irc: Use a bool instead of an error for validation
2 files changed,
+37,
-114
+1,
-7
1@@ -194,14 +194,8 @@ func NewSession(conn io.ReadWriteCloser, params SessionParams) (s Session, err e
2
3 for r.Scan() {
4 line := r.Text()
5-
6 msg, err := Tokenize(line)
7- if err != nil {
8- continue
9- }
10-
11- err = msg.Validate()
12- if err != nil {
13+ if err != nil || !msg.IsValid() {
14 continue
15 }
16
+36,
-107
1@@ -232,131 +232,60 @@ func (msg *Message) String() string {
2 return sb.String()
3 }
4
5-func (msg *Message) Validate() (err error) {
6+func (msg *Message) IsValid() bool {
7 switch msg.Command {
8- case rplWelcome:
9- if len(msg.Params) < 1 {
10- err = errNotEnoughParams
11- }
12- case rplIsupport:
13- if len(msg.Params) < 3 {
14- err = errNotEnoughParams
15- }
16+ case "AUTHENTICATE", "PING", "PONG":
17+ return 1 <= len(msg.Params)
18+ case rplEndofnames, rplLoggedout, rplMotd, rplNotopic, rplWelcome, rplYourhost:
19+ return 2 <= len(msg.Params)
20+ case rplIsupport, rplLoggedin, rplTopic:
21+ return 3 <= len(msg.Params)
22+ case rplNamreply:
23+ return 4 <= len(msg.Params)
24 case rplWhoreply:
25- if len(msg.Params) < 8 {
26- err = errNotEnoughParams
27- }
28- case rplMotd:
29- if len(msg.Params) < 2 {
30- err = errNotEnoughParams
31- }
32- case "AUTHENTICATE":
33- if len(msg.Params) < 1 {
34- err = errNotEnoughParams
35- }
36- case rplLoggedin:
37- if len(msg.Params) < 3 {
38- err = errNotEnoughParams
39- }
40- case rplLoggedout:
41- if len(msg.Params) < 2 {
42- err = errNotEnoughParams
43- }
44- case "CAP":
45- if len(msg.Params) < 3 {
46- err = errNotEnoughParams
47- } else if msg.Params[1] == "LS" {
48- } else if msg.Params[1] == "LIST" {
49- } else if msg.Params[1] == "ACK" {
50- } else if msg.Params[1] == "NAK" {
51- } else if msg.Params[1] == "NEW" {
52- } else if msg.Params[1] == "DEL" {
53- } else {
54- err = errUnknownCommand
55- }
56- case "JOIN":
57- if len(msg.Params) < 1 {
58- err = errNotEnoughParams
59- } else if msg.Prefix == "" {
60- err = errNoPrefix
61- }
62- case "PART":
63- if len(msg.Params) < 1 {
64- err = errNotEnoughParams
65- } else if msg.Prefix == "" {
66- err = errNoPrefix
67- }
68+ return 8 <= len(msg.Params)
69+ case "JOIN", "PART", "TAGMSG":
70+ return 1 <= len(msg.Params) && msg.Prefix != ""
71+ case "PRIVMSG", "NOTICE", "TOPIC":
72+ return 2 <= len(msg.Params) && msg.Prefix != ""
73 case "QUIT":
74- if msg.Prefix == "" {
75- err = errNoPrefix
76- }
77- case rplNamreply:
78- if len(msg.Params) < 4 {
79- err = errNotEnoughParams
80- }
81- case rplTopic:
82- if len(msg.Params) < 3 {
83- err = errNotEnoughParams
84- }
85+ return msg.Prefix != ""
86+ case "CAP":
87+ return 3 <= len(msg.Params) &&
88+ (msg.Params[1] == "LS" ||
89+ msg.Params[1] == "LIST" ||
90+ msg.Params[1] == "ACK" ||
91+ msg.Params[1] == "NAK" ||
92+ msg.Params[1] == "NEW" ||
93+ msg.Params[1] == "DEL")
94 case rplTopicwhotime:
95 if len(msg.Params) < 4 {
96- err = errNotEnoughParams
97- } else if _, err := strconv.ParseInt(msg.Params[3], 10, 64); err != nil {
98- err = errIncompleteMessage
99- }
100- case rplNotopic:
101- if len(msg.Params) < 2 {
102- err = errNotEnoughParams
103- }
104- case "TOPIC":
105- if len(msg.Params) < 2 {
106- err = errNotEnoughParams
107- } else if msg.Prefix == "" {
108- err = errNoPrefix
109- }
110- case "PRIVMSG", "NOTICE":
111- if len(msg.Params) < 2 {
112- err = errNotEnoughParams
113- } else if msg.Prefix == "" {
114- err = errNoPrefix
115- }
116- case "TAGMSG":
117- if len(msg.Params) < 1 {
118- err = errNotEnoughParams
119- } else if msg.Prefix == "" {
120- err = errNoPrefix
121+ return false
122 }
123+ _, err := strconv.ParseInt(msg.Params[3], 10, 64)
124+ return err != nil
125 case "BATCH":
126 if len(msg.Params) < 1 {
127- err = errNotEnoughParams
128- break
129+ return false
130 }
131 if len(msg.Params[0]) < 2 {
132- err = errEmptyBatchID
133- break
134+ return false
135 }
136 if msg.Params[0][0] == '+' {
137 if len(msg.Params) < 2 {
138- err = errNotEnoughParams
139- break
140+ return false
141 }
142- if msg.Params[1] == "chathistory" && len(msg.Params) < 3 {
143- err = errNotEnoughParams
144+ switch msg.Params[1] {
145+ case "chathistory":
146+ return 3 <= len(msg.Params)
147+ default:
148+ return false
149 }
150- } else if msg.Params[0][0] != '-' {
151- err = errEmptyBatchID
152- }
153- case "PING":
154- if len(msg.Params) < 1 {
155- err = errNotEnoughParams
156- }
157- case "PONG":
158- if len(msg.Params) < 1 {
159- err = errNotEnoughParams
160 }
161+ return msg.Params[0][0] == '-'
162 default:
163+ return false
164 }
165- return
166 }
167
168 func (msg *Message) Time() (t time.Time, ok bool) {