Skip to content

Instantly share code, notes, and snippets.

@lopex
Created November 20, 2015 11:16
Show Gist options
  • Save lopex/f186911316642dccd1ff to your computer and use it in GitHub Desktop.
Save lopex/f186911316642dccd1ff to your computer and use it in GitHub Desktop.
#[macro_use] extern crate nickel;
#[macro_use] extern crate horrorshow;
extern crate regex;
use nickel::*;
use horrorshow::prelude::*;
use regex::Regex as r;
macro_rules! load {
{ $($value:expr),+ } => {
{
let mut m = ::std::collections::HashMap::new();
$(m.insert($value, include_str!($value));)+
m
}
}
}
fn header(title: String) -> Box<RenderBox> {
box_html! {
head {
title { :title }
link(rel="stylesheet", href="bootstrap.min.css"){}
@ for am in vec!["", "-animate", "-route", "-sanitize", "-cookies"] {
script(type="text/javascript", src=format!("angular{}.min.js", am)){}
}
script(type="text/javascript", src="angular-strap.min.js"){}
script(type="text/javascript", src="angular-strap.tpl.min.js"){}
script(type="text/javascript", src="app.js"){}
}
}
}
fn main() {
let resources = load!{
"bootstrap.min.css",
"angular.min.js", "angular-animate.min.js", "angular-cookies.min.js", "angular-route.min.js", "angular-sanitize.min.js", "angular-strap.min.js", "angular-strap.tpl.min.js", "app.js"
};
let mut server = Nickel::new();
server.utilize(middleware!{|request| println!("{:?}", request.origin.uri);});
server.get(r::new("/(?P<res>.+?\\.(?:js|css))$").unwrap(), middleware!{|request, response|
let result = request.param("res").and_then(|res| resources.get(res)).unwrap();
result.to_string()
});
server.get("/", middleware!{|_, response|
let app_name = "App";
let result = html! {
html {
:header(app_name.to_string());
body(ng-app="app") {
div(class="nav navbar navbar-default") {
div(class="container") {
div(class="navbar-header") {
a(class="navbar-brand") { span{:app_name} }
}
div(class="navbar-collapse collapse") {
ul(class="nav navbar-nav navbar-left") {
li { a(href="#test"){:"test"}}
}
}
}
}
div(class="container") {
div(class="panel panel-default") {
div(class="panel-heading"){:"Hello"}
div(class="panel-body"){
div(class="ng-view"){}
}
div(class="panel-footer"){}
}
}
}
}
};
result.into_string().unwrap()
});
server.get("/test", middleware!{|_, response| (html!{
button(class="btn btn-default", ng-click="hello()"){:"{{name}}"}
}).into_string().unwrap()
});
server.get("/hello", middleware!{|_, response| "hello"});
server.listen("127.0.0.1:8080");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment