diff options
author | rtkay123 <dev@kanjala.com> | 2025-07-12 13:46:33 +0200 |
---|---|---|
committer | rtkay123 <dev@kanjala.com> | 2025-07-12 13:46:33 +0200 |
commit | ba14505f39d8634921f260d715aa8e66f2a14406 (patch) | |
tree | e8d2cc267302d4036c42bb16b77029c6a6799f9d /src | |
parent | 1dc7dccb7536f6831de570f535e6911384e1a7e4 (diff) | |
download | sellershut-ba14505f39d8634921f260d715aa8e66f2a14406.tar.bz2 sellershut-ba14505f39d8634921f260d715aa8e66f2a14406.zip |
feat: start server
Diffstat (limited to 'src')
-rw-r--r-- | src/error.rs | 26 | ||||
-rw-r--r-- | src/main.rs | 19 | ||||
-rw-r--r-- | src/server.rs | 12 | ||||
-rw-r--r-- | src/server/routes.rs | 31 | ||||
-rw-r--r-- | src/state.rs | 3 |
5 files changed, 89 insertions, 2 deletions
diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..730f99a --- /dev/null +++ b/src/error.rs @@ -0,0 +1,26 @@ +use axum::{ + http::StatusCode, + response::{IntoResponse, Response}, +}; + +#[derive(Debug)] +pub struct AppError(anyhow::Error); + +impl IntoResponse for AppError { + fn into_response(self) -> Response { + ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Something went wrong: {}", self.0), + ) + .into_response() + } +} + +impl<E> From<E> for AppError +where + E: Into<anyhow::Error>, +{ + fn from(err: E) -> Self { + Self(err.into()) + } +} diff --git a/src/main.rs b/src/main.rs index e7a11a9..9a73196 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,18 @@ -fn main() { - println!("Hello, world!"); +mod error; +mod server; +mod state; + +use stack_up::{Monitoring, tracing::Tracing}; + +use crate::error::AppError; + +#[tokio::main] +async fn main() -> Result<(), AppError> { + let _tracing = Tracing::builder().build(&Monitoring { + log_level: "trace".into(), + }); + let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await?; + tracing::debug!("listening on {}", listener.local_addr()?); + axum::serve(listener, server::router()).await?; + Ok(()) } diff --git a/src/server.rs b/src/server.rs new file mode 100644 index 0000000..b639964 --- /dev/null +++ b/src/server.rs @@ -0,0 +1,12 @@ +use axum::{Router, routing::get}; +use tower_http::trace::TraceLayer; + +use crate::server::routes::health_check; + +pub mod routes; + +pub fn router() -> Router { + Router::new() + .route("/", get(health_check)) + .layer(TraceLayer::new_for_http()) +} diff --git a/src/server/routes.rs b/src/server/routes.rs new file mode 100644 index 0000000..aa8fa92 --- /dev/null +++ b/src/server/routes.rs @@ -0,0 +1,31 @@ +use axum::response::IntoResponse; + +pub async fn health_check() -> impl IntoResponse { + let name = env!("CARGO_PKG_NAME"); + let ver = env!("CARGO_PKG_VERSION"); + + format!("{name} v{ver} is live") +} + +#[cfg(test)] +mod tests { + use axum::{ + body::Body, + http::{Request, StatusCode}, + }; + use tower::ServiceExt; + + use crate::server; + + #[tokio::test] + async fn hello_world() { + let app = server::router(); + + let response = app + .oneshot(Request::builder().uri("/").body(Body::empty()).unwrap()) + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + } +} diff --git a/src/state.rs b/src/state.rs new file mode 100644 index 0000000..69c6208 --- /dev/null +++ b/src/state.rs @@ -0,0 +1,3 @@ +pub struct AppState {} + +impl AppState {} |