#[cfg(all(feature = "logging", not(feature = "trace")))]
use log::LevelFilter;
#[cfg(feature = "trace")]
use tracing::Level;
use ratpack::prelude::*;
async fn log(
req: Request
,
resp: Option>,
_params: Params,
_app: App<(), NoState>,
_state: NoState,
) -> HTTPResult {
#[cfg(all(feature = "logging", not(feature = "trace")))]
log::trace!("New request: {}", req.uri().path());
#[cfg(feature = "trace")]
tracing::trace!("New request: {}", req.uri().path());
Ok((req, resp, NoState {}))
}
async fn hello(
req: Request,
_resp: Option>,
params: Params,
_app: App<(), NoState>,
_state: NoState,
) -> HTTPResult {
let name = params.get("name").unwrap();
#[cfg(all(feature = "logging", not(feature = "trace")))]
log::info!("Saying hello to {}", name);
#[cfg(feature = "trace")]
tracing::info!("Saying hello to {}", name);
let bytes = Body::from(format!("hello, {}!\n", name));
return Ok((
req,
Some(Response::builder().status(200).body(bytes).unwrap()),
NoState,
));
}
#[tokio::main]
async fn main() -> Result<(), ServerError> {
#[cfg(all(feature = "logging", not(feature = "trace")))]
env_logger::builder()
.target(env_logger::Target::Stderr)
.filter(None, LevelFilter::Trace)
.init();
#[cfg(feature = "trace")]
{
let subscriber = tracing_subscriber::FmtSubscriber::builder()
// all spans/events with a level higher than TRACE (e.g, debug, info, warn, etc.)
// will be written to stdout.
.with_max_level(Level::TRACE)
// completes the builder.
.finish();
tracing::subscriber::set_global_default(subscriber)
.expect("setting default subscriber failed");
}
let mut app = App::new();
app.get("/:name", compose_handler!(log, hello));
app.serve("127.0.0.1:3000").await?;
Ok(())
}