Last active
June 17, 2017 08:14
-
-
Save andete/02975114ecf5b1014d66a2c33cb48540 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#![feature(plugin)] | |
#![plugin(rocket_codegen)] | |
extern crate rocket; | |
#[macro_use] | |
extern crate log; | |
use rocket::request::{Outcome, Request, FromRequest}; | |
use rocket::outcome::Outcome::*; | |
use rocket::response::{NamedFile, Redirect, content}; | |
use rocket::http::{Cookie, Cookies}; | |
use std::str::FromStr; | |
#[derive(PartialEq)] | |
enum Lang { | |
Nl, | |
En, | |
} | |
impl Default for Lang { | |
fn default() -> Lang { | |
Lang::Nl | |
} | |
} | |
impl FromStr for Lang { | |
type Err = Error; | |
fn from_str(s:&str) -> Result<Self> { | |
match s { | |
"nl" => Ok(Lang::Nl), | |
"en" => Ok(Lang::En), | |
o => Err(format!("Unsupported language: {}", o).into()), | |
} | |
} | |
} | |
impl Into<&'static str> for Lang { | |
fn into(self) -> &'static str { | |
match self { | |
Lang::Nl => "nl", | |
Lang::En => "en", | |
} | |
} | |
} | |
impl<'a, 'r> FromRequest<'a, 'r> for Lang { | |
type Error = (); | |
fn from_request(request: &'a Request<'r>) -> Outcome<Lang, ()> { | |
match request.cookies().get_private("lang") { | |
Some(r) => { | |
match Lang::from_str(r.value()) { | |
Ok(l) => Success(l), | |
Err(_) => Success(Lang::default()), | |
} | |
} | |
None => Success(Lang::default()), | |
} | |
} | |
} | |
struct Referer { | |
url:String | |
} | |
impl<'a, 'r> FromRequest<'a, 'r> for Referer { | |
type Error = (); | |
fn from_request(request: &'a Request<'r>) -> Outcome<Referer, ()> { | |
match request.headers().get_one("Referer") { | |
Some(r) => Success(Referer { url:r.into() }), | |
None => Forward(()), | |
} | |
} | |
} | |
#[get("/page")] | |
fn page(lang: Lang) -> content::HTML<String> { | |
let hello = if lang == Lang::Nl { | |
"Hallo daar!" | |
} else { | |
"Hello there!" | |
}; | |
content::HTML(format!( | |
"<html> | |
<body> | |
<h1>{}</h1> | |
<a href='/lang/en'>English</a> | |
<a href='/lang/nl'>Nederlands</a> | |
</body> | |
</html>", hello)) | |
} | |
#[get("/lang/<lang>")] | |
fn lang(mut cookies: Cookies, referer: Referer, lang: String) -> Result<Redirect> { | |
let lang:&'static str = Lang::from_str(&lang)?.into(); | |
info!("Setting language to: {}", lang); | |
cookies.add_private(Cookie::new("lang", lang)); | |
Ok(Redirect::to(&referer.url)) | |
} | |
fn main() { | |
rocket::ignite() | |
.attach(Template::fairing()) | |
.mount("/", routes![lang , page]) | |
.launch(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment