aboutsummaryrefslogtreecommitdiff
path: root/karlc/src/client.rs
diff options
context:
space:
mode:
Diffstat (limited to 'karlc/src/client.rs')
-rw-r--r--karlc/src/client.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/karlc/src/client.rs b/karlc/src/client.rs
new file mode 100644
index 0000000..6420da0
--- /dev/null
+++ b/karlc/src/client.rs
@@ -0,0 +1,42 @@
+use std::{
+ io::{BufRead, BufReader, Write},
+ os::unix::net::UnixStream,
+ thread,
+};
+
+use crossbeam_channel::Receiver;
+use karlcommon::{ClientboundPacket, ServerboundPacket};
+use log::debug;
+
+pub struct Client {
+ socket: UnixStream,
+ pub receiver: Receiver<ClientboundPacket>,
+}
+
+impl Client {
+ pub fn new(socket: UnixStream) -> Self {
+ let (sender, receiver) = crossbeam_channel::unbounded();
+ let mut reader = BufReader::new(socket.try_clone().unwrap());
+ thread::spawn(move || {
+ loop {
+ let mut buf = String::new();
+ reader.read_line(&mut buf).unwrap();
+ let p: ClientboundPacket = serde_json::from_str(buf.as_str()).unwrap();
+ debug!("<- {:?}", p);
+ sender.send(p).unwrap();
+ }
+ });
+ let mut c = Self { receiver, socket };
+ c.send(ServerboundPacket::Handshake {
+ version: env!("CARGO_PKG_VERSION").to_owned(),
+ });
+ return c;
+ }
+
+ pub fn send(&mut self, p: ServerboundPacket) {
+ debug!("-> {:?}", p);
+ self.socket
+ .write_fmt(format_args!("{}\n", serde_json::to_string(&p).unwrap()))
+ .unwrap()
+ }
+}