Initial Commit

This commit is contained in:
2026-02-22 09:55:19 +01:00
commit a68403d3ae
15 changed files with 851 additions and 0 deletions

68
src/lib.rs Normal file
View File

@@ -0,0 +1,68 @@
mod messages;
mod metadata;
use std::{
io::{Read, Write},
os::unix::net::UnixStream,
};
use crate::{messages::*, metadata::OtdIpcMetadata};
pub struct OtdIpc {
stream: UnixStream,
}
impl OtdIpc {
pub fn new(name: &str, version: &str) -> Result<Self, Box<dyn std::error::Error>> {
let meta = OtdIpcMetadata::new()?;
let mut stream = UnixStream::connect(meta.socket)?;
let hello = Hello::new(
0x022026020501,
name,
version,
&format!("{}.{}", slug::slugify(name), meta.id),
1,
)?;
stream.write_all(&Vec::from(hello))?;
Ok(Self { stream })
}
}
impl Iterator for OtdIpc {
type Item = Message;
fn next(&mut self) -> Option<Self::Item> {
let mut raw_header = [0; size_of::<Header>()];
self.stream.read_exact(&mut raw_header).ok()?;
let header: Header = raw_header[..].try_into().ok()?;
let mut raw_buffer = vec![0; (header.size as usize) - size_of::<Header>()];
self.stream.read_exact(&mut raw_buffer).ok()?;
match header.message_type {
messages::MessageType::None => None,
messages::MessageType::DeviceInfo => Some(Message::DeviceInfo(Box::new(
DeviceInfo::try_from(&raw_buffer[..]).ok()?,
))),
messages::MessageType::State => {
Some(Message::State(State::try_from(&raw_buffer[..]).ok()?))
}
messages::MessageType::Ping => {
Some(Message::Ping(Ping::try_from(&raw_buffer[..]).ok()?))
}
messages::MessageType::DebugMessage => {
Some(Message::DebugMessage(DebugMessage::from(&raw_buffer[..])))
}
messages::MessageType::Experimental => {
Some(Message::Experimental(Experimental::from(&raw_buffer[..])))
}
messages::MessageType::Hello => {
// Some(Message::Hello(Hello::from(&raw_buffer[..])))
None
}
}
}
}