-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.hy
67 lines (53 loc) · 2.28 KB
/
parser.hy
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
(import datetime math)
(defclass InvalidInputException [Exception])
(defn dec [n]
(- n 1))
(defn last-char [s]
;; strangely (cut s -1) stopped working
(setv size (len s))
(cut s (dec size) size))
(defn timeout-to-sec [timeout-str]
(assert (> (len timeout-str 1)))
(setv modifier-symb (last-char timeout-str))
(cond [(.isdigit modifier-symb) (setv modifier 1)]
[(= "s" modifier-symb) (setv modifier 1)]
[(= "m" modifier-symb) (setv modifier 60)]
[(= "h" modifier-symb) (setv modifier (* 60 60))]
[(= "d" modifier-symb) (setv modifier (* 24 60 60))]
[True (raise (ValueError (.format "Error: invalid modifier in {}: {}" timeout-str modifier-symb)))])
(try
(if (.isdigit modifier-symb)
(setv timeout-str-without-modifier timeout-str)
(setv timeout-str-without-modifier (cut timeout-str 0 -1)))
(* (int timeout-str-without-modifier) modifier)
(except [e ValueError]
(raise (ValueError (.format "Error: {} is invalid for timeout" timeout-str))))))
(defn parse-input [input]
(try
(setv [command parameters] (.split input :maxsplit 1))
(except [e ValueError]
(raise (ValueError (.format "Not enough parameters: {}" (str))))))
(cond [(= command "/later") (parse-as-later parameters)]
[(= command "/at") (parse-as-at parameters)]
[True (raise (ValueError (.format "Unknown command, should be /later or /at: {}" command)))]))
(defn parse-as-later [parameters]
(setv example "/later 1h message")
(try
(setv [when message] (.split parameters :maxsplit 1))
(except [e ValueError]
(raise (ValueError (.format "Error: not enough arguments. Example: {}" example)))))
(try
(setv timeout (timeout-to-sec when))
(except [e Exception]
(raise (ValueError (.format "Error while parsing: {}" (str e))))))
(, timeout message))
(defn parse-as-at [parameters]
(setv example "/at 2018:12:24::10:15:00 message")
(try
(setv [when message] (.split parameters :maxsplit 1))
(except [e ValueError]
(raise (ValueError (.format "Error: not enough arguments. Example: {}" example)))))
(setv date (datetime.datetime.strptime when "%Y:%m:%d::%H:%M:%S"))
(setv now (datetime.datetime.now))
(setv timeout (math.ceil (.total-seconds (- date now))))
(, timeout message))