]> piware.de Git - learn-rust.git/blob - axum-server/src/main.rs
3212d3f250962e2f422419951e1ce0fd0d355b13
[learn-rust.git] / axum-server / src / main.rs
1 use std::io;
2
3 use axum::{
4     routing::{get, get_service},
5     extract::{Path, TypedHeader},
6     http::{StatusCode},
7     response,
8     Router};
9
10 async fn hello(Path(name): Path<String>, user_agent: Option<TypedHeader<axum::headers::UserAgent>>) -> impl response::IntoResponse {
11     if let Some(TypedHeader(user_agent)) = user_agent {
12         (StatusCode::OK, format!("Hello {} from {}", name, user_agent))
13     } else {
14         (StatusCode::OK, format!("Hello {}", name))
15     }
16 }
17
18 #[tokio::main]
19 async fn main() {
20     tracing_subscriber::fmt::init();
21     let app = Router::new()
22         .route("/hello/:name", get(hello))
23         .route("/static",
24                get_service(tower_http::services::ServeFile::new("Cargo.toml").precompressed_gzip())
25                    .handle_error(|e: io::Error| async move {
26                        (StatusCode::INTERNAL_SERVER_ERROR, format!("Unhandled internal error: {}", e))
27                    })
28         )
29         .layer(
30             tower::ServiceBuilder::new()
31                 .layer(
32                     tower_http::trace::TraceLayer::new_for_http()
33                          .make_span_with(tower_http::trace::DefaultMakeSpan::default().include_headers(true)),
34                 )
35         );
36
37     let addr = std::net::SocketAddr::from(([127, 0, 0, 1], 3000));
38     tracing::info!("listening on {}", addr);
39     axum::Server::bind(&addr)
40         .serve(app.into_make_service())
41         .await
42         .unwrap();
43 }