summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2025-07-12 13:46:33 +0200
committerrtkay123 <dev@kanjala.com>2025-07-12 13:46:33 +0200
commitba14505f39d8634921f260d715aa8e66f2a14406 (patch)
treee8d2cc267302d4036c42bb16b77029c6a6799f9d /src
parent1dc7dccb7536f6831de570f535e6911384e1a7e4 (diff)
downloadsellershut-ba14505f39d8634921f260d715aa8e66f2a14406.tar.bz2
sellershut-ba14505f39d8634921f260d715aa8e66f2a14406.zip
feat: start server
Diffstat (limited to 'src')
-rw-r--r--src/error.rs26
-rw-r--r--src/main.rs19
-rw-r--r--src/server.rs12
-rw-r--r--src/server/routes.rs31
-rw-r--r--src/state.rs3
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 {}