pub struct Context { /* private fields */ }Implementations§
Source§impl Context
impl Context
pub fn new() -> Self
Sourcepub fn get<T: Send + Sync + 'static>(&self) -> Option<&T>
pub fn get<T: Send + Sync + 'static>(&self) -> Option<&T>
Examples found in repository?
examples/homepage.rs (line 27)
24async fn logger(req: Request, next: Next) -> Result<Response, Error> {
25 let method = req.method().clone();
26 let path = req.uri().path().to_owned();
27 let id = req.ctx().get::<RequestId>().map(|r| r.0);
28 let user = rustio_core::auth::identity(req.ctx()).map(|i| i.email.clone());
29 let started = Instant::now();
30 let result = next.run(req).await;
31 let status = match &result {
32 Ok(resp) => resp.status().as_u16(),
33 Err(err) => err.status(),
34 };
35 let id_display = id.map(|i| format!("req-{i}")).unwrap_or_else(|| "-".into());
36 let user_display = user.unwrap_or_else(|| "-".into());
37 eprintln!(
38 "[{:>3}] {:>4} {} id={} user={} ({:?})",
39 status,
40 method,
41 path,
42 id_display,
43 user_display,
44 started.elapsed()
45 );
46 result
47}
48
49#[tokio::main]
50async fn main() -> std::io::Result<()> {
51 let addr: SocketAddr = ([127, 0, 0, 1], 3000).into();
52 let db = Db::memory().await.expect("db connect");
53 auth::ensure_core_tables(&db)
54 .await
55 .expect("create auth tables");
56 auth::user::create(&db, "admin@example.com", "admin", "admin")
57 .await
58 .expect("seed admin user");
59
60 let router = with_defaults(Router::new())
61 .get("/whoami", |req, _params| async move {
62 let id = req
63 .ctx()
64 .get::<RequestId>()
65 .map(|r| r.0.to_string())
66 .unwrap_or_else(|| "unknown".into());
67 Ok::<Response, Error>(text(format!("your request id is req-{id}\n")))
68 })
69 .get("/me", |req, _params| async move {
70 let id = require_auth(req.ctx())?;
71 Ok::<Response, Error>(text(format!("hello {}\n", id.email)))
72 })
73 .get("/admin-only", |req, _params| async move {
74 let id = require_admin(req.ctx())?;
75 Ok::<Response, Error>(text(format!("hello admin {}\n", id.email)))
76 })
77 .get("/crash", |_req, _params| async {
78 Err::<Response, Error>(Error::Internal("simulated failure".into()))
79 })
80 .get("/unauth", |_req, _params| async {
81 Err::<Response, Error>(Error::Unauthorized)
82 })
83 .wrap(request_id)
84 .wrap(authenticate(db))
85 .wrap(logger);
86 Server::bind(addr).serve_router(router).await
87}pub fn get_mut<T: Send + Sync + 'static>(&mut self) -> Option<&mut T>
pub fn remove<T: Send + Sync + 'static>(&mut self) -> Option<T>
pub fn contains<T: 'static>(&self) -> bool
pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Context
impl !RefUnwindSafe for Context
impl Send for Context
impl Sync for Context
impl Unpin for Context
impl UnsafeUnpin for Context
impl !UnwindSafe for Context
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more