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) {