use std::convert::Infallible;
use std::net::SocketAddr;
use http_body_util::Full;
use hyper::body::Bytes;
use hyper::server::conn::http1;
use hyper::service::service_fn;
use hyper::{Request, Response};
use miette::Result;
use tokio::net::TcpListener;
use super::CommandHandler;
use crate::api::SWH_HTTP_API_PORT;
use async_trait::async_trait;
use clap::Args;
pub struct ServeCommand;
#[derive(Debug, Args)]
pub struct ServeArgs {}
#[async_trait]
impl CommandHandler<ServeArgs> for ServeCommand {
async fn process(&self, _args: &ServeArgs) -> Result<()> {
let addr: SocketAddr = ([127, 0, 0, 1], SWH_HTTP_API_PORT).into();
let listener = TcpListener::bind(addr)
.await
.expect("create listener error");
loop {
let (stream, _) = listener.accept().await.expect("msg");
tokio::task::spawn(async move {
if let Err(err) = http1::Builder::new()
.serve_connection(stream, service_fn(serve))
.await
{
eprintln!("Error serving connection: {:?}", err);
}
});
}
}
}
async fn serve(_: Request<hyper::body::Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {
Ok(Response::new(Full::new(Bytes::from("imok"))))
}