Repository navigation
Expand file tree
/
Copy pathstate.mojo
More file actions
78 lines (58 loc) · 2.18 KB
/
Copy pathstate.mojo
File metadata and controls
78 lines (58 loc) · 2.18 KB
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
68
69
70
71
72
73
74
75
76
77
78
"""Example 16 - shared application state via a captured handler.
Shows how a handler reads request-independent state without globals
or a framework-provided injection layer. The pattern is a wrapping
``Handler`` struct that captures state by value; ``flare.http``
treats middleware-style wrappers as first-class because they
implement the same ``Handler`` trait the leaf handlers do.
Run:
pixi run example-state
"""
from flare.http import (
Router,
Handler,
Request,
Response,
ok,
)
# Application state - a tiny counter, Copyable so the wrapping
# handler can hand a snapshot to each layer.
@fieldwise_init
struct Counters(Copyable, Movable):
var hits: Int
var misses: Int
def home(req: Request) raises -> Response:
return ok("home")
def details(req: Request) raises -> Response:
return ok("details")
@fieldwise_init
struct _ObserveHits[Inner: Handler](Handler):
"""Middleware that tags the response with the captured snapshot."""
var inner: Self.Inner
var counters: Counters
def serve(self, req: Request) raises -> Response:
var resp = self.inner.serve(req).lower()
resp.headers.set("X-Hits", String(self.counters.hits))
resp.headers.set("X-Misses", String(self.counters.misses))
return resp^
def main() raises:
print("=" * 60)
print("flare example 16 - shared state via a captured handler")
print("=" * 60)
var router = Router()
router.get("/", home)
router.get("/details", details)
# The wrapper holds the state and is itself a Handler; serve it
# directly. Mutable shared state would store atomics or use an
# interior-mutability type instead of a plain ``Counters``.
var serve_tree = _ObserveHits(
inner=router^, counters=Counters(hits=7, misses=2)
)
var resp = serve_tree.serve(Request.test_get("/"))
print("GET / →", resp.status, resp.text())
print(" X-Hits: ", resp.headers.get("X-Hits"))
print(" X-Misses: ", resp.headers.get("X-Misses"))
var resp2 = serve_tree.serve(Request.test_get("/details"))
print("GET /details →", resp2.status, resp2.text())
print(" X-Hits: ", resp2.headers.get("X-Hits"))
print()
print("OK.")