aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormetamuffin <yvchraiqi@protonmail.com>2022-06-10 10:04:27 +0200
committermetamuffin <yvchraiqi@protonmail.com>2022-06-10 10:04:27 +0200
commit829f0dc5ac68ee8a030894ce26c83b1c4eb02104 (patch)
treeb159f3d5257f69fac6f0951b778d4b7f8d9e50b5 /src
parenta392a04c83b4e0a8050066280f7efc74d182bcab (diff)
downloadkarlender-829f0dc5ac68ee8a030894ce26c83b1c4eb02104.tar
karlender-829f0dc5ac68ee8a030894ce26c83b1c4eb02104.tar.bz2
karlender-829f0dc5ac68ee8a030894ce26c83b1c4eb02104.tar.zst
blub
Diffstat (limited to 'src')
-rw-r--r--src/interface.rs49
-rw-r--r--src/main.rs67
2 files changed, 51 insertions, 65 deletions
diff --git a/src/interface.rs b/src/interface.rs
index 0020736..fcdb470 100644
--- a/src/interface.rs
+++ b/src/interface.rs
@@ -1,24 +1,22 @@
+use super::protocol::{ClientboundPacket, ServerboundPacket};
+use crate::handle_packet;
+use log::{debug, error, info, warn};
use std::io;
use std::io::{BufRead, BufReader, ErrorKind, Write};
use std::os::unix::net::{UnixListener, UnixStream};
use std::thread;
-use super::protocol::{ClientboundPacket, ServerboundPacket};
-use crossbeam_channel::Sender;
-use log::{debug, error, info, warn};
-
-pub fn network_loop(s: Sender<(u32, ServerboundPacket, Sender<ClientboundPacket>)>) {
+pub fn network_loop() {
let listener = UnixListener::bind("/run/user/1000/calendar").unwrap();
let mut id_counter = 0;
loop {
let (stream, addr) = listener.accept().unwrap();
- let s = s.clone();
let id = id_counter;
id_counter += 1;
thread::spawn(move || {
info!("client connected: {:?}", addr);
- if let Err(err) = handle_connection(id, stream.try_clone().unwrap(), s.clone()) {
+ if let Err(err) = handle_connection(id, stream.try_clone().unwrap()) {
warn!("client dropped: {:?} ({})", addr, err);
} else {
info!("client dropped: {:?}", addr);
@@ -27,11 +25,7 @@ pub fn network_loop(s: Sender<(u32, ServerboundPacket, Sender<ClientboundPacket>
}
}
-fn handle_connection(
- id: u32,
- mut stream: UnixStream,
- s: Sender<(u32, ServerboundPacket, Sender<ClientboundPacket>)>,
-) -> io::Result<()> {
+fn handle_connection(id: u32, mut stream: UnixStream) -> io::Result<()> {
let mut reader = BufReader::new(stream.try_clone()?);
let (responder, responses) = crossbeam_channel::unbounded();
responder
@@ -52,22 +46,23 @@ fn handle_connection(
}
}
});
- let mut buf = String::new();
- loop {
- if reader.read_line(&mut buf)? == 0 {
- break Ok(());
- };
- match serde_json::from_str::<ServerboundPacket>(buf.as_str()) {
- Ok(packet) => {
- debug!("{id} <- {packet:?}");
- s.send((id, packet, responder.clone()))
- .map_err(|_| io::Error::from(ErrorKind::InvalidInput))?;
+ {
+ let mut buf = String::new();
+ loop {
+ if reader.read_line(&mut buf)? == 0 {
+ break Ok(());
+ };
+ match serde_json::from_str::<ServerboundPacket>(buf.as_str()) {
+ Ok(packet) => {
+ debug!("{id} <- {packet:?}");
+ handle_packet(id, packet, responder.clone());
+ }
+ Err(err) => responder
+ .send(ClientboundPacket::Error(format!("{}", &err)))
+ .map_err(|_| io::Error::from(ErrorKind::InvalidInput))?,
}
- Err(err) => responder
- .send(ClientboundPacket::Error(format!("{}", &err)))
- .map_err(|_| io::Error::from(ErrorKind::InvalidInput))?,
- }
- buf.clear();
+ buf.clear();
+ }
}
}
diff --git a/src/main.rs b/src/main.rs
index e447202..9a84286 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -2,52 +2,43 @@ pub mod condition;
pub mod interface;
pub mod protocol;
-use crossbeam_channel::{Receiver, Sender};
-use interface::network_loop;
-use protocol::{ClientboundPacket, ServerboundPacket};
-use std::time::Duration;
-
use crate::{
condition::{Condition, Property},
protocol::Task,
};
+use crossbeam_channel::Sender;
+use interface::network_loop;
+use protocol::{ClientboundPacket, ServerboundPacket};
fn main() {
- let (s, r) = crossbeam_channel::unbounded();
- std::thread::spawn(move || network_loop(s));
- main_loop(r)
+ network_loop();
}
-fn main_loop(packets: Receiver<(u32, ServerboundPacket, Sender<ClientboundPacket>)>) {
- loop {
- for (client_id, packet, responder) in packets.try_iter() {
- println!("{:?}, {:?}, {:?}", client_id, packet, responder);
- match packet {
- ServerboundPacket::Download => {
- let _ = responder.send(ClientboundPacket::DownloadResponse(vec![Task {
- name: "blub".to_string(),
- description: "blob".to_string(),
- tags: vec![],
- priority: 69.0,
- completed: None,
- scheduled: None,
- occurence: Some(Condition::And(vec![
- Condition::Equal {
- modulus: None,
- prop: Property::Monthofyear,
- value: 1,
- },
- Condition::Equal {
- modulus: None,
- prop: Property::Hour,
- value: 12,
- },
- ])),
- deadline: None,
- }]));
- }
- }
+pub fn handle_packet(client: u32, packet: ServerboundPacket, responder: Sender<ClientboundPacket>) {
+ println!("{:?}, {:?}, {:?}", client, packet, responder);
+ match packet {
+ ServerboundPacket::Download => {
+ let _ = responder.send(ClientboundPacket::DownloadResponse(vec![Task {
+ name: "blub".to_string(),
+ description: "blob".to_string(),
+ tags: vec![],
+ priority: 69.0,
+ completed: None,
+ scheduled: None,
+ occurence: Some(Condition::And(vec![
+ Condition::Equal {
+ modulus: None,
+ prop: Property::Monthofyear,
+ value: 1,
+ },
+ Condition::Equal {
+ modulus: None,
+ prop: Property::Hour,
+ value: 12,
+ },
+ ])),
+ deadline: None,
+ }]));
}
- std::thread::sleep(Duration::from_secs_f64(10.0 / 30.0));
}
}