diff options
| author | Fuwn <[email protected]> | 2022-04-07 03:05:12 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2022-04-07 03:05:12 +0000 |
| commit | 595f719e2ec9f9b90ee19971d00b7a0496ee1394 (patch) | |
| tree | 98cdcd1d98919b8199f5aa27964e0b5664de14b8 | |
| parent | docs(readme): link to example gemini capsule (diff) | |
| download | windmark-595f719e2ec9f9b90ee19971d00b7a0496ee1394.tar.xz windmark-595f719e2ec9f9b90ee19971d00b7a0496ee1394.zip | |
refactor(examples): bind router
| -rw-r--r-- | examples/windmark.rs | 279 |
1 files changed, 138 insertions, 141 deletions
diff --git a/examples/windmark.rs b/examples/windmark.rs index 5cbdf9f..709c552 100644 --- a/examples/windmark.rs +++ b/examples/windmark.rs @@ -54,153 +54,150 @@ impl windmark::Module for Clicker { #[windmark::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let mut error_count = 0; + let mut router = windmark::Router::new(); - windmark::Router::new() - .set_private_key_file("windmark_private.pem") - .set_certificate_file("windmark_public.pem") - .enable_default_logger(true) - .set_error_handler(Box::new(move |_| { - error_count += 1; + router.set_private_key_file("windmark_private.pem"); + router.set_certificate_file("windmark_public.pem"); + router.enable_default_logger(true); + router.set_error_handler(Box::new(move |_| { + error_count += 1; - println!("{} errors so far", error_count); + println!("{} errors so far", error_count); - Response::PermanentFailure("e".into()) - })) - .attach_stateless(|r| { - r.mount( - "/module", - Box::new(|_| Response::Success("This is a module!".into())), - ); - }) - .attach(Clicker::default()) - .set_pre_route_callback(Box::new(|stream, url, _| { - info!( - "accepted connection from {} to {}", - stream.peer_addr().unwrap().ip(), - url.to_string() - ) - })) - .set_post_route_callback(Box::new(|stream, _url, _| { - info!( - "closed connection from {}", - stream.peer_addr().unwrap().ip() - ) - })) - .add_header(Box::new(|_| "```\nART IS COOL\n```\nhi".to_string())) - .add_footer(Box::new(|_| "Copyright 2022".to_string())) - .add_footer(Box::new(|context| { - format!("Another footer, but lower! (from {})", context.url.path()) - })) - .mount( - "/", - Box::new(|_| { - Response::Success( - "# INDEX\n\nWelcome!\n\n=> /test Test Page\n=> /time Unix Epoch" - .to_string(), - ) - }), - ) - .mount( - "/ip", - Box::new(|context| { - Response::Success( - { format!("Hello, {}", context.tcp.peer_addr().unwrap().ip()) } - .into(), - ) - }), - ) - .mount( - "/test", - Box::new(|_| Response::Success("hi there\n=> / back".to_string())), - ) - .mount( - "/temporary-failure", - Box::new(|_| Response::TemporaryFailure("Woops, temporarily...".into())), - ) - .mount( - "/time", - Box::new(|_| { - Response::Success( - std::time::UNIX_EPOCH - .elapsed() - .unwrap() - .as_nanos() - .to_string(), - ) - }), - ) - .mount( - "/query", - Box::new(|context| { - Response::Success(format!( - "queries: {:?}", - windmark::utilities::queries_from_url(&context.url) - )) - }), - ) - .mount( - "/param/:lang", - Box::new(|context| { - Response::Success(format!( - "Parameter lang is {}", - context.params.get("lang").unwrap() - )) - }), - ) - .mount( - "/names/:first/:last", - Box::new(|context| { - Response::Success(format!( - "{} {}", - context.params.get("first").unwrap(), - context.params.get("last").unwrap() - )) - }), - ) - .mount( - "/input", - Box::new(|context| { - if let Some(name) = context.url.query() { - Response::Success(format!("Your name is {}!", name)) - } else { - Response::Input("What is your name?".into()) - } - }), - ) - .mount( - "/sensitive-input", - Box::new(|context| { - if let Some(password) = context.url.query() { - Response::Success(format!("Your password is {}!", password)) - } else { - Response::SensitiveInput("What is your password?".into()) - } - }), - ) - .mount( - "/error", - Box::new(|_| Response::CertificateNotValid("no".into())), + Response::PermanentFailure("e".into()) + })); + router.attach_stateless(|r| { + r.mount( + "/module", + Box::new(|_| Response::Success("This is a module!".into())), + ); + }); + router.attach(Clicker::default()); + router.set_pre_route_callback(Box::new(|stream, url, _| { + info!( + "accepted connection from {} to {}", + stream.peer_addr().unwrap().ip(), + url.to_string() ) - .mount( - "/redirect", - Box::new(|_| { - Response::PermanentRedirect("gemini://localhost/test".into()) - }), + })); + router.set_post_route_callback(Box::new(|stream, _url, _| { + info!( + "closed connection from {}", + stream.peer_addr().unwrap().ip() ) - .mount("/file", { - #[cfg(feature = "auto-deduce-mime")] - { - Box::new(|_| Response::SuccessFile(include_bytes!("../LICENSE"))) + })); + router.add_header(Box::new(|_| "```\nART IS COOL\n```\nhi".to_string())); + router.add_footer(Box::new(|_| "Copyright 2022".to_string())); + router.add_footer(Box::new(|context| { + format!("Another footer, but lower! (from {})", context.url.path()) + })); + router.mount( + "/", + Box::new(|_| { + Response::Success( + "# INDEX\n\nWelcome!\n\n=> /test Test Page\n=> /time Unix Epoch" + .to_string(), + ) + }), + ); + router.mount( + "/ip", + Box::new(|context| { + Response::Success( + { format!("Hello, {}", context.tcp.peer_addr().unwrap().ip()) }.into(), + ) + }), + ); + router.mount( + "/test", + Box::new(|_| Response::Success("hi there\n=> / back".to_string())), + ); + router.mount( + "/temporary-failure", + Box::new(|_| Response::TemporaryFailure("Woops, temporarily...".into())), + ); + router.mount( + "/time", + Box::new(|_| { + Response::Success( + std::time::UNIX_EPOCH + .elapsed() + .unwrap() + .as_nanos() + .to_string(), + ) + }), + ); + router.mount( + "/query", + Box::new(|context| { + Response::Success(format!( + "queries: {:?}", + windmark::utilities::queries_from_url(&context.url) + )) + }), + ); + router.mount( + "/param/:lang", + Box::new(|context| { + Response::Success(format!( + "Parameter lang is {}", + context.params.get("lang").unwrap() + )) + }), + ); + router.mount( + "/names/:first/:last", + Box::new(|context| { + Response::Success(format!( + "{} {}", + context.params.get("first").unwrap(), + context.params.get("last").unwrap() + )) + }), + ); + router.mount( + "/input", + Box::new(|context| { + if let Some(name) = context.url.query() { + Response::Success(format!("Your name is {}!", name)) + } else { + Response::Input("What is your name?".into()) + } + }), + ); + router.mount( + "/sensitive-input", + Box::new(|context| { + if let Some(password) = context.url.query() { + Response::Success(format!("Your password is {}!", password)) + } else { + Response::SensitiveInput("What is your password?".into()) } + }), + ); + router.mount( + "/error", + Box::new(|_| Response::CertificateNotValid("no".into())), + ); + router.mount( + "/redirect", + Box::new(|_| Response::PermanentRedirect("gemini://localhost/test".into())), + ); + router.mount("/file", { + #[cfg(feature = "auto-deduce-mime")] + { + Box::new(|_| Response::SuccessFile(include_bytes!("../LICENSE"))) + } - #[cfg(not(feature = "auto-deduce-mime"))] - Box::new(|_| { - Response::SuccessFile( - include_bytes!("../LICENSE"), - "text/plain".to_string(), - ) - }) + #[cfg(not(feature = "auto-deduce-mime"))] + Box::new(|_| { + Response::SuccessFile( + include_bytes!("../LICENSE"), + "text/plain".to_string(), + ) }) - .run() - .await + }); + + router.run().await } |