1 module hunt.http.routing.RouterManager;
2
3 import hunt.http.routing.handler;
4 import hunt.http.routing.Matcher;
5 import hunt.http.routing.Router;
6 import hunt.http.routing.impl.RouterManagerImpl;
7
8 import hunt.http.server.HttpRequestOptions;
9 import hunt.http.server.HttpServerContext;
10
11 import hunt.collection;
12 import hunt.Exceptions;
13 import hunt.util.Common;
14
15 /**
16 *
17 */
18 enum RouteGroupType {
19 Default,
20 Host,
21 Path
22 }
23
24 enum DEFAULT_LAST_ROUTER_ID = int.max / 2;
25
26 /**
27 *
28 */
29 interface RouterManager {
30
31 Router register();
32
33 Router register(int id);
34
35 NavigableSet!(RouterMatchResult) findRouter(string method, string path,
36 string contentType, string accept);
37
38 void accept(HttpServerContext context);
39
40 // static RouterManager create() {
41 // return create(new HttpRequestOptions());
42 // }
43
44 static RouterManager create() {
45 RouterManagerImpl routerManager = new RouterManagerImpl();
46
47 routerManager.register().path("*").handler(new DefaultRouteHandler());
48
49 Router currentRouter = routerManager.register(DEFAULT_LAST_ROUTER_ID);
50 currentRouter.path("*")
51 .handler(ErrorResponseHandler.Default());
52
53 version(HUNT_HTTP_DEBUG) {
54 import hunt.logging;
55 tracef("routeid: %d, paths: *", currentRouter.getId());
56 }
57
58 return routerManager;
59 }
60 }
61
62 /**
63 *
64 */
65 class RouterMatchResult : Comparable!RouterMatchResult {
66
67 private Router router;
68 private Map!(string, string) parameters;
69 private Set!(Matcher.MatchType) matchTypes;
70
71 this(Router router, Map!(string, string) parameters, Set!(Matcher.MatchType) matchTypes) {
72 this.router = router;
73 this.parameters = parameters;
74 this.matchTypes = matchTypes;
75 }
76
77 Router getRouter() {
78 return router;
79 }
80
81 Map!(string, string) getParameters() {
82 return parameters;
83 }
84
85 Set!(Matcher.MatchType) getMatchTypes() {
86 return matchTypes;
87 }
88
89 override int opCmp(Object o) {
90 RouterMatchResult r = cast(RouterMatchResult) o;
91 if (o is null)
92 throw new NullPointerException();
93 return opCmp(r);
94 }
95
96 int opCmp(RouterMatchResult o) {
97 return router.opCmp(o.getRouter());
98 }
99
100 override bool opEquals(Object o) {
101 if (this is o)
102 return true;
103 if (o is null || typeid(this) != typeid(o))
104 return false;
105 RouterMatchResult that = cast(RouterMatchResult) o;
106 return router == that.router;
107 }
108
109 override size_t toHash() @trusted nothrow {
110 return hashOf(router);
111 }
112 }