use std::io;
use anyhow::Result;
use axum::routing::{get, post};
use axum::Router;
use tokio::net::TcpListener;
use crate::handlers::home;
use crate::handlers::register_user::register_user;
use crate::handlers::user::user;
use crate::handlers::users::users;
use crate::objects::fakehub::FakeHub;
use crate::sys::sys_info::sys_info;
pub mod handlers;
pub mod objects;
pub mod report;
pub mod sys;
#[allow(unused_imports)]
#[macro_use]
extern crate hamcrest;
#[derive(Default)]
pub struct Server {
port: usize,
}
impl Server {
pub fn new(port: usize) -> Server {
Server { port }
}
}
#[derive(Clone)]
pub struct ServerConfig {
pub fakehub: FakeHub,
}
impl Server {
pub async fn start(self) -> Result<()> {
let addr: String = format!("0.0.0.0:{}", self.port);
sys_info();
let started: io::Result<TcpListener> = TcpListener::bind(addr.clone()).await;
match started {
Ok(listener) => axum::serve(
listener,
Router::new()
.route("/", get(home::home))
.route("/users", post(register_user))
.route("/users/:login", get(user))
.route("/users", get(users))
.with_state(ServerConfig {
fakehub: FakeHub::with_addr(addr),
}),
)
.await
.ok(),
Err(err) => {
panic!("Can't bind address {}: '{}'", addr.clone(), err)
}
};
Ok(())
}
}
#[cfg(test)]
mod tests {
use anyhow::Result;
use hamcrest::{equal_to, is, HamcrestMatcher};
#[test]
fn creates_the_server() -> Result<()> {
let server = crate::Server::new(1234);
assert_that!(server.port, is(equal_to(1234)));
Ok(())
}
}