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
use slog; use crate::cfg::AppConfig; use crate::profile::UserProfile; use crate::result::Result; pub trait Router { fn route(&self, path: &str, args: &[&str]) -> Result<String>; fn route_simple(&self, path: &str) -> Result<String> { const NO_PARAMS: [&str; 0] = []; self.route(path, &NO_PARAMS) } fn route_static(&self, path: &str, filename: &str, ext: &str) -> Result<String> { let p = format!("{}/{}.{}", path, filename, ext); self.route("static", &[&p]) } } pub struct RequestContext { app: AppConfig, user: UserProfile, router: Box<dyn Router + 'static>, log: slog::Logger } impl std::fmt::Debug for RequestContext { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "RequestContext [{:?}] [{:?}]", self.user, self.app) } } impl RequestContext { pub fn new(app: AppConfig, user: UserProfile, router: impl Router + 'static, log: slog::Logger) -> RequestContext { RequestContext { app, user, router: Box::new(router), log } } pub fn app(&self) -> &AppConfig { &self.app } pub fn user(&self) -> &UserProfile { &self.user } pub fn router(&self) -> &Box<dyn Router + 'static> { &self.router } pub fn log(&self) -> &slog::Logger { &self.log } }