aboutsummaryrefslogtreecommitdiff
path: root/karld/src/interface/generic.rs
diff options
context:
space:
mode:
authormetamuffin <yvchraiqi@protonmail.com>2022-08-17 22:04:32 +0200
committermetamuffin <yvchraiqi@protonmail.com>2022-08-17 22:04:32 +0200
commit4cad1fc66422f84ade7ee29f86f5a43738c065f4 (patch)
tree815e44d69cc34d42669c866d043f7d09d3172290 /karld/src/interface/generic.rs
parente87219d47764f82d073f464a23aa18a6f7d0c9d3 (diff)
downloadkarlender-4cad1fc66422f84ade7ee29f86f5a43738c065f4.tar
karlender-4cad1fc66422f84ade7ee29f86f5a43738c065f4.tar.bz2
karlender-4cad1fc66422f84ade7ee29f86f5a43738c065f4.tar.zst
add more interfaces
Diffstat (limited to 'karld/src/interface/generic.rs')
-rw-r--r--karld/src/interface/generic.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/karld/src/interface/generic.rs b/karld/src/interface/generic.rs
new file mode 100644
index 0000000..4c35fdf
--- /dev/null
+++ b/karld/src/interface/generic.rs
@@ -0,0 +1,61 @@
+use crate::handle_packet;
+use karlcommon::{version, ClientboundPacket, ProtoError, ServerboundPacket};
+use log::{debug, error, warn};
+use std::{
+ io::{self, BufRead, BufReader, ErrorKind, Read, Write},
+ thread,
+};
+
+pub fn generic_handle_connection<ReadStream: Read, WriteStream: Write + Send + 'static>(
+ id: u32,
+ rstream: ReadStream,
+ wstream: WriteStream,
+) -> io::Result<()> {
+ let mut reader = BufReader::new(rstream);
+ let (responder, responses) = crossbeam_channel::unbounded();
+ responder
+ .send(ClientboundPacket::Handshake {
+ version: version!(),
+ })
+ .unwrap();
+
+ thread::spawn(move || {
+ let mut wstream = wstream;
+ for m in responses {
+ debug!("{id} -> {m:?}");
+ match wstream
+ .write_fmt(format_args!("{}\n", serde_json::to_string(&m).unwrap()))
+ .map_err(|e| e.kind())
+ {
+ Ok(_) => (),
+ Err(ErrorKind::BrokenPipe) => break,
+ Err(e) => error!("network error: {:?}", e),
+ }
+ }
+ });
+ {
+ 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) => {
+ warn!("client error: {:?}", &err);
+ responder
+ .send(ClientboundPacket::Error(ProtoError::FormatError(format!(
+ "{}",
+ &err
+ ))))
+ .map_err(|_| io::Error::from(ErrorKind::InvalidInput))?
+ }
+ }
+
+ buf.clear();
+ }
+ }
+}