use std::net::SocketAddr;
use crate::{error::Result, router::Router};
pub struct RustAPI {
router: Router,
port: u16,
host: String,
}
impl RustAPI {
pub fn new(router: Router) -> Self {
Self {
router,
port: 3000,
host: "0.0.0.0".to_string(),
}
}
pub fn port(mut self, port: u16) -> Self {
self.port = port;
self
}
pub fn host(mut self, host: impl Into<String>) -> Self {
self.host = host.into();
self
}
pub async fn serve(self) -> Result<()> {
let addr = format!("{}:{}", self.host, self.port);
let socket_addr: SocketAddr = addr.parse().map_err(|e| {
crate::error::Error::server_error(format!("Invalid address {}: {}", addr, e))
})?;
let listener = tokio::net::TcpListener::bind(socket_addr)
.await
.map_err(|e| {
crate::error::Error::server_error(format!(
"Failed to bind to {}: {}",
socket_addr, e
))
})?;
tracing::info!("Server running on http://{}", socket_addr);
axum::serve(listener, self.router)
.await
.map_err(|e| crate::error::Error::server_error(format!("Server error: {}", e)))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_rust_api_defaults() {
let router = crate::router::build();
let server = RustAPI::new(router);
assert_eq!(server.port, 3000);
assert_eq!(server.host, "0.0.0.0");
}
#[test]
fn test_rust_api_builder() {
let router = crate::router::build();
let server = RustAPI::new(router).port(8080).host("127.0.0.1");
assert_eq!(server.port, 8080);
assert_eq!(server.host, "127.0.0.1");
}
}