use std::sync::Arc;
use rainier_container::facade;
use rainier_view::ViewEngine;
#[derive(Clone)]
pub struct Views(pub Arc<dyn ViewEngine>);
impl Views {
pub fn new(engine: Arc<dyn ViewEngine>) -> Self {
Self(engine)
}
pub fn engine(&self) -> &Arc<dyn ViewEngine> {
&self.0
}
pub fn render(&self, name: &str, data: &serde_json::Value) -> rainier_support::Result<String> {
self.0.render(name, data)
}
pub fn render_view(&self, view: &rainier_view::View) -> rainier_support::Result<String> {
self.0.render_view(view)
}
}
impl std::fmt::Debug for Views {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("Views(..)")
}
}
facade!(
Config => rainier_config::Config
);
facade!(
Event => rainier_events::Dispatcher
);
facade!(
DB => rainier_database::Database
);
facade!(
Queue => rainier_queue::QueueManager
);
facade!(
Mail => rainier_mail::Mailer
);
facade!(
View => Views
);
facade!(
Url => rainier_routing::UrlGenerator
);
facade!(
Middleware => rainier_middleware::MiddlewareRegistry
);
facade!(
Crypt => rainier_crypt::Encryption
);
facade!(
Notify => rainier_notify::Notifier
);
facade!(
Broadcast => rainier_broadcast::Broadcasting
);
facade!(
Cache => rainier_cache::CacheManager
);
facade!(
Storage => rainier_filesystem::Storage
);
facade!(
Session => rainier_session::SessionManager
);
#[cfg(test)]
mod tests {
use super::*;
use rainier_container::{
clear_facade_application, set_facade_application, Application, Facade,
};
use rainier_view::MemoryEngine;
static SERIAL: std::sync::Mutex<()> = std::sync::Mutex::new(());
fn install(build: impl FnOnce(&Application)) -> std::sync::MutexGuard<'static, ()> {
let guard = SERIAL.lock().unwrap_or_else(|e| e.into_inner());
let app = Application::new(".");
build(&app);
set_facade_application(Arc::new(app));
guard
}
#[test]
fn the_config_facade_reads_through_the_container() {
let _guard = install(|app| {
let config = rainier_config::Config::new();
config.set("app.name", "Rainier").unwrap();
app.instance(config);
});
assert_eq!(Config::instance().string("app.name").as_deref(), Some("Rainier"));
clear_facade_application();
}
#[test]
fn the_view_facade_renders() {
let _guard = install(|app| {
app.instance(Views::new(Arc::new(
MemoryEngine::new().with("greeting", "Hi {{ name }}"),
)));
});
let rendered =
View::instance().render("greeting", &serde_json::json!({ "name": "Ada" })).unwrap();
assert_eq!(rendered, "Hi Ada");
clear_facade_application();
}
#[test]
fn rebinding_swaps_what_every_call_sees() {
let _guard = install(|app| {
app.instance(Views::new(Arc::new(MemoryEngine::new().with("t", "first"))));
});
assert_eq!(View::instance().render("t", &serde_json::json!({})).unwrap(), "first");
rainier_container::facade_application()
.instance(Views::new(Arc::new(MemoryEngine::new().with("t", "second"))));
assert_eq!(View::instance().render("t", &serde_json::json!({})).unwrap(), "second");
clear_facade_application();
}
#[test]
fn an_unbound_facade_reads_as_none_rather_than_panicking_through_try() {
let _guard = install(|_| {});
assert!(DB::try_instance().is_none());
clear_facade_application();
}
}