Render page template within an HTML boilerplate
This commit is contained in:
parent
c17b5642c0
commit
69444ebcaa
10
Makefile
10
Makefile
@ -31,19 +31,19 @@ help:
|
||||
.PHONY: build run test bench doc examples graphs clean
|
||||
|
||||
build:
|
||||
$(CARGO) build
|
||||
cargo build
|
||||
|
||||
run:
|
||||
$(CARGO) run
|
||||
cargo run
|
||||
|
||||
clean:
|
||||
$(CARGO) clean
|
||||
cargo clean
|
||||
|
||||
doc:
|
||||
$(CARGO) doc
|
||||
cargo doc
|
||||
|
||||
test:
|
||||
$(CARGO) test
|
||||
cargo test
|
||||
|
||||
graphs-png: $(GRAPH_IMG)
|
||||
design/%.png: design/%.gv
|
||||
|
@ -1,11 +1,57 @@
|
||||
use handlebars_iron as hbi;
|
||||
|
||||
use handlebars::{Handlebars, no_escape};
|
||||
use handlebars_iron::{DirectorySource, HandlebarsEngine};
|
||||
use handlebars_iron::handlebars::to_json;
|
||||
use handlebars_iron::Template;
|
||||
use iron::prelude::{Request, Response};
|
||||
use iron::{IronResult, Set, status};
|
||||
use mount::Mount;
|
||||
use serde::ser::Serialize as ToJson;
|
||||
use serde_json::value::Map;
|
||||
use staticfile::Static;
|
||||
use std::error::Error;
|
||||
use std::path::Path;
|
||||
use std::sync::Arc;
|
||||
|
||||
pub fn template_engine() -> Arc<HandlebarsEngine> {
|
||||
let views_ext = ".hbs";
|
||||
let views_path = "./src/views";
|
||||
|
||||
let mut hbs = Handlebars::new();
|
||||
|
||||
// @TODO Find better solution for rendering included template file
|
||||
hbs.register_escape_fn(no_escape);
|
||||
|
||||
|
||||
let mut hbse = HandlebarsEngine::from(hbs);
|
||||
hbse.add(Box::new(
|
||||
DirectorySource::new(views_path, views_ext)
|
||||
));
|
||||
|
||||
if let Err(r) = hbse.reload() {
|
||||
panic!("{:?}", r.description());
|
||||
}
|
||||
|
||||
let hbse_ref = Arc::new(hbse);
|
||||
if cfg!(debug_assertions) {
|
||||
println!("Templates are being watched.");
|
||||
use handlebars_iron::Watchable;
|
||||
hbse_ref.watch(views_path);
|
||||
}
|
||||
|
||||
hbse_ref
|
||||
}
|
||||
|
||||
pub fn render_page<T: ToJson>(name: &str, template_data: T) -> Template {
|
||||
let template_engine = template_engine().clone();
|
||||
let template_registry = template_engine.handlebars_mut();
|
||||
|
||||
let page = template_registry.render(name, &template_data).unwrap();
|
||||
|
||||
let mut data = Map::new();
|
||||
data.insert("page".to_string(), to_json(page));
|
||||
|
||||
Template::new("layout/base", data)
|
||||
}
|
||||
|
||||
pub struct AssetsHandler;
|
||||
|
||||
@ -18,15 +64,14 @@ impl AssetsHandler {
|
||||
}
|
||||
}
|
||||
|
||||
fn render_page<T: ToJson>(name: &str, value: T) -> hbi::Template {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
pub fn hello_world (_request: &mut Request) -> IronResult<Response> {
|
||||
use handlebars_iron::Template;
|
||||
use serde_json::value::{Map, Value};
|
||||
|
||||
let mut data = Map::new();
|
||||
data.insert("title".to_string(), to_json(&"Media Collection CRUD".to_owned()));
|
||||
|
||||
let mut response = Response::new();
|
||||
response.set_mut(Template::new("index","".to_string()))
|
||||
response.set_mut(render_page("index", data))
|
||||
.set_mut(status::Ok);
|
||||
|
||||
Ok(response)
|
||||
|
@ -2,5 +2,5 @@ pub mod chain;
|
||||
pub mod db;
|
||||
pub mod handlers;
|
||||
pub mod models;
|
||||
|
||||
// pub mod schema;
|
||||
|
||||
|
47
src/main.rs
47
src/main.rs
@ -2,46 +2,9 @@
|
||||
#[macro_use] extern crate mime;
|
||||
|
||||
use env_logger;
|
||||
use iron::prelude::Iron;
|
||||
|
||||
use handlebars as hbs;
|
||||
use handlebars_iron as hbi;
|
||||
|
||||
use hbs::Handlebars;
|
||||
use hbi::{DirectorySource, HandlebarsEngine};
|
||||
|
||||
use iron::prelude::{Chain, Iron};
|
||||
use std::error::Error;
|
||||
use std::sync::Arc;
|
||||
|
||||
use media_collection_crud::{chain, db};
|
||||
|
||||
fn init_templating() -> Chain {
|
||||
let views_ext = ".hbs";
|
||||
let views_path = "./src/views";
|
||||
|
||||
let hbs = Handlebars::new();
|
||||
let mut hbse = HandlebarsEngine::from(hbs);
|
||||
// TODO: Investigate serving the templates out of the binary using include_string!
|
||||
hbse.add(Box::new(
|
||||
DirectorySource::new(views_path, views_ext)
|
||||
));
|
||||
|
||||
if let Err(r) = hbse.reload() {
|
||||
panic!("{:?}", r.description());
|
||||
}
|
||||
|
||||
let hbse_ref = Arc::new(hbse);
|
||||
if cfg!(debug_assertions) {
|
||||
println!("Templates are being watched.");
|
||||
use hbi::Watchable;
|
||||
hbse_ref.watch(views_path);
|
||||
}
|
||||
|
||||
let mut chain = chain::init();
|
||||
chain.link_after(hbse_ref);
|
||||
|
||||
chain
|
||||
}
|
||||
use media_collection_crud::{chain, handlers, db};
|
||||
|
||||
fn main() {
|
||||
env_logger::init();
|
||||
@ -50,7 +13,11 @@ fn main() {
|
||||
let port = 8000;
|
||||
let bind_addr = format!("localhost:{}", port);
|
||||
|
||||
let _server_guard = Iron::new(init_templating())
|
||||
let mut chain = chain::init();
|
||||
let templating_engine = handlers::template_engine().clone();
|
||||
chain.link_after(templating_engine);
|
||||
|
||||
let _server_guard = Iron::new(chain)
|
||||
.http(bind_addr.as_str())
|
||||
.unwrap();
|
||||
}
|
@ -2,7 +2,7 @@ use diesel::Queryable;
|
||||
|
||||
// use crate::schema::*;
|
||||
|
||||
#[derive(Queryable)]
|
||||
#[derive(Debug, Queryable)]
|
||||
// #[table_name="media"]
|
||||
pub struct Media {
|
||||
pub id: u32,
|
||||
@ -10,7 +10,7 @@ pub struct Media {
|
||||
pub notes: String,
|
||||
}
|
||||
|
||||
#[derive(Queryable)]
|
||||
#[derive(Debug, Queryable)]
|
||||
// #[table_name="media_type"]
|
||||
pub struct MediaType {
|
||||
pub id: u32,
|
||||
@ -18,7 +18,7 @@ pub struct MediaType {
|
||||
pub description: String,
|
||||
}
|
||||
|
||||
#[derive(Queryable)]
|
||||
#[derive(Debug, Queryable)]
|
||||
// #[table_name="media_format"]
|
||||
pub struct MediaFormat {
|
||||
pub id: u32,
|
||||
@ -27,7 +27,7 @@ pub struct MediaFormat {
|
||||
pub description: String,
|
||||
}
|
||||
|
||||
#[derive(Queryable)]
|
||||
#[derive(Debug, Queryable)]
|
||||
pub struct MediaTypeFormatLink {
|
||||
pub media_type_id: i32,
|
||||
pub media_format_id: i32,
|
||||
|
3
src/views/footer.hbs
Normal file
3
src/views/footer.hbs
Normal file
@ -0,0 +1,3 @@
|
||||
<footer>
|
||||
<p>© Timothy J. Warren</p>
|
||||
</footer>
|
3
src/views/header.hbs
Normal file
3
src/views/header.hbs
Normal file
@ -0,0 +1,3 @@
|
||||
<header>
|
||||
<h1>Media Collection CRUD</h1>
|
||||
</header>
|
@ -1,13 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>Rust web server</title>
|
||||
<link rel="stylesheet" href="/public/css/mini-default.min.css" />
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1>Hello, world!</h1>
|
||||
</header>
|
||||
</body>
|
||||
</html>
|
||||
<main>
|
||||
<h2>Index Page</h2>
|
||||
<p>Testing rendering of internal content.</p>
|
||||
</main>
|
@ -1,15 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>{{#title}}Rust web server{{/title}}</title>
|
||||
<link rel="stylesheet" href="/public/css/mini-default.min.css" />
|
||||
</head>
|
||||
<body>
|
||||
{{> layout/top}}
|
||||
{{> header}}
|
||||
{{#block "content"}}
|
||||
Some default content
|
||||
{{/block}}
|
||||
{{~ page}}
|
||||
{{> footer}}
|
||||
</body>
|
||||
</html>
|
||||
{{> layout/bottom}}
|
2
src/views/layout/bottom.hbs
Normal file
2
src/views/layout/bottom.hbs
Normal file
@ -0,0 +1,2 @@
|
||||
</body>
|
||||
</html>
|
8
src/views/layout/top.hbs
Normal file
8
src/views/layout/top.hbs
Normal file
@ -0,0 +1,8 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>{{title}}</title>
|
||||
<link rel="stylesheet" href="/public/css/mini-default.min.css" />
|
||||
</head>
|
||||
<body>
|
Loading…
Reference in New Issue
Block a user