58 lines
1.8 KiB
Rust
58 lines
1.8 KiB
Rust
use crate::config::Context;
|
|
|
|
use serde_json;
|
|
use std::io;
|
|
use std::sync::Arc;
|
|
use tokio::io::AsyncWriteExt;
|
|
use tokio::net::TcpSocket;
|
|
use tokio::sync::RwLock;
|
|
|
|
pub async fn apiserver(ctxarc: &Arc<RwLock<Context>>) -> io::Result<()> {
|
|
let ctxclone = Arc::clone(ctxarc);
|
|
let ctx = ctxclone.read().await;
|
|
let addr = ctx.cfg.api.parse().unwrap();
|
|
drop(ctx);
|
|
|
|
let socket = TcpSocket::new_v4().unwrap();
|
|
socket.bind(addr).unwrap();
|
|
socket.set_reuseaddr(true).unwrap();
|
|
let listener = socket.listen(1024).unwrap();
|
|
|
|
tokio::spawn(async move {
|
|
loop {
|
|
//apitx.send(String::from("")).await.unwrap();
|
|
match listener.accept().await {
|
|
Ok((stream, _addr)) => {
|
|
//let mut buf = [0; 1024];
|
|
let data;
|
|
{
|
|
let ctx = ctxclone.read().await;
|
|
data = serde_json::to_string(&ctx.blocklist);
|
|
}
|
|
|
|
match data {
|
|
Ok(dt) => {
|
|
let (_reader, mut writer) = stream.into_split();
|
|
match writer.write_all(format!("{dt}").as_bytes()).await {
|
|
Ok(a) => {
|
|
println!("{a:?}");
|
|
}
|
|
Err(err) => {
|
|
println!("{err}");
|
|
}
|
|
}
|
|
}
|
|
Err(err) => {
|
|
println!("unable to serialize data: {err}");
|
|
}
|
|
}
|
|
}
|
|
Err(err) => {
|
|
println!("couldn't get client: {}", err)
|
|
}
|
|
}
|
|
}
|
|
});
|
|
Ok(())
|
|
}
|