blob: d7a8f974123514aafa34b8b76f09578814a94381 (
plain)
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
|
module Main
%default total
data Matcher =
Directory String Matcher
| Capture Matcher
| End
HandlerType : Matcher -> Type
HandlerType (Directory s m) = HandlerType m
HandlerType (Capture m) = String -> HandlerType m
HandlerType End = String
Handler : Type
Handler = (m : Matcher ** HandlerType m)
dispatch : (handlers : List Handler) -> String -> Maybe String
dispatch [] _ = Nothing
dispatch handlers path = go handlers components where
components : List String
components = filter (/="") (split (=='/') path)
go : List Handler -> List String -> Maybe String
go [] cs = Nothing
go ((m ** f) :: hs) cs =
let next = go hs cs in
case m of
Directory dir matcher => case cs of
(c :: cs') => if c == dir then go ((matcher ** f) :: hs) cs' else next
_ => next
Capture matcher => case cs of
(c :: cs') => go ((matcher ** f c) :: hs) cs'
_ => next
End => Just f
helloHandler : String -> String -> String
helloHandler firstName lastName = "Hello, " ++ firstName ++ " " ++ lastName
weatherHandler : String -> String
weatherHandler place = "The weather in " ++ place ++ " is cold."
handlers : List Handler
handlers = [
(Directory "hello" (Capture (Capture End)) ** helloHandler)
, (Directory "weather" (Capture End) ** weatherHandler)
]
main : IO ()
main = do
putStrLn (fromMaybe "failed" $ dispatch handlers "hello/Bob/Sunshine")
putStrLn (fromMaybe "failed" $ dispatch handlers "weather/New York")
|