mirror of https://github.com/rwf2/Rocket.git
Add form kitchen sink example.
This commit is contained in:
parent
23808d00bc
commit
6fe2f51332
|
@ -23,5 +23,5 @@ members = [
|
|||
"examples/stream",
|
||||
"examples/json",
|
||||
"examples/handlebars_templates",
|
||||
"examples/form_types",
|
||||
"examples/form_kitchen_sink",
|
||||
]
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "form_kitchen_sink"
|
||||
version = "0.0.1"
|
||||
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
||||
workspace = "../../"
|
||||
|
||||
[dependencies]
|
||||
rocket = { path = "../../lib" }
|
||||
rocket_codegen = { path = "../../codegen" }
|
|
@ -0,0 +1,62 @@
|
|||
#![feature(plugin, custom_derive)]
|
||||
#![plugin(rocket_codegen)]
|
||||
|
||||
extern crate rocket;
|
||||
|
||||
use rocket::{Rocket, Request};
|
||||
use rocket::response::NamedFile;
|
||||
use rocket::form::FromFormValue;
|
||||
use std::io;
|
||||
|
||||
// TODO: Make deriving `FromForm` for this enum possible.
|
||||
#[derive(Debug)]
|
||||
enum FormOption {
|
||||
A, B, C
|
||||
}
|
||||
|
||||
impl<'v> FromFormValue<'v> for FormOption {
|
||||
type Error = &'v str;
|
||||
|
||||
fn parse(v: &'v str) -> Result<Self, Self::Error> {
|
||||
let variant = match v {
|
||||
"a" => FormOption::A,
|
||||
"b" => FormOption::B,
|
||||
"c" => FormOption::C,
|
||||
_ => return Err(v)
|
||||
};
|
||||
|
||||
Ok(variant)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, FromForm)]
|
||||
struct FormInput<'r> {
|
||||
checkbox: bool,
|
||||
number: usize,
|
||||
radio: FormOption,
|
||||
password: &'r str,
|
||||
textarea: String,
|
||||
select: FormOption,
|
||||
}
|
||||
|
||||
#[post("/", form = "<sink>")]
|
||||
fn sink(sink: FormInput) -> String {
|
||||
format!("{:?}", sink)
|
||||
}
|
||||
|
||||
#[post("/", rank = 2)]
|
||||
fn sink2(request: &Request) -> &'static str {
|
||||
println!("form: {:?}", std::str::from_utf8(request.data.as_slice()));
|
||||
"Sorry, the form is invalid."
|
||||
}
|
||||
|
||||
#[get("/")]
|
||||
fn index() -> io::Result<NamedFile> {
|
||||
NamedFile::open("static/index.html")
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut rocket = Rocket::new("localhost", 8000);
|
||||
rocket.mount("/", routes![index, sink, sink2]);
|
||||
rocket.launch();
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
<h1>Rocket Form Kitchen Sink</h1>
|
||||
|
||||
<form action="/" method="post" accept-charset="utf-8">
|
||||
<label>Checkbox:
|
||||
<input type="hidden" name="checkbox" value="off">
|
||||
<input type="checkbox" name="checkbox" value="on">
|
||||
</label><br /><br />
|
||||
|
||||
<label>Number:
|
||||
<input name="number" type="number" value="123" />
|
||||
</label><br /><br />
|
||||
|
||||
<label>Password:
|
||||
<input name="password" type="password" />
|
||||
</label>
|
||||
<br /><br />
|
||||
|
||||
<label for="radio">Radios:
|
||||
<label for="a">A
|
||||
<input type="radio" name="radio" id="a" value="a" />
|
||||
</label>
|
||||
<label for="b">B
|
||||
<input type="radio" name="radio" id="b" value="b" checked />
|
||||
</label>
|
||||
<label for="c">C
|
||||
<input type="radio" name="radio" id="c" value="c" />
|
||||
</label>
|
||||
</label>
|
||||
<br /><br />
|
||||
|
||||
<label>Textarea:
|
||||
<textarea name="textarea" rows="10" cols="50">Write something here.</textarea>
|
||||
</label>
|
||||
<br /><br />
|
||||
|
||||
<label>Select:
|
||||
<select name="select">
|
||||
<option value="a">Value A</option>
|
||||
<option value="b" selected>Value B</option>
|
||||
<option value="c">Value C</option>
|
||||
</select>
|
||||
</label>
|
||||
<br /><br />
|
||||
|
||||
<label>Submit:
|
||||
<input type="submit" value="Login">
|
||||
</label>
|
||||
<br /><br />
|
||||
</form>
|
Loading…
Reference in New Issue