klemmbrett 0.1.1

Minimalist, dumb and fast wayland native clipboard history manager
use std::io::{self, BufReader, Write};
use std::os::unix::net::UnixStream;

use super::{Command, Entry, MAGIC, Uuid, read_status, read_u8, socket_path};

fn send(cmd: Command, payload: &[u8]) -> io::Result<BufReader<UnixStream>> {
    let mut stream = UnixStream::connect(socket_path())?;
    let mut req = MAGIC.to_le_bytes().to_vec();
    req.push(cmd as u8);
    req.extend_from_slice(payload);
    stream.write_all(&req)?;

    let mut r = BufReader::new(stream);
    read_status(&mut r)?.map_err(io::Error::other)?;
    Ok(r)
}

pub fn get(id: Uuid) -> io::Result<Entry> {
    Entry::read(&mut send(Command::Get, &id)?)
}

pub fn set(id: Uuid) -> io::Result<()> {
    send(Command::Set, &id).map(drop)
}

pub fn list(amount: u8, offset: u32) -> io::Result<Vec<Entry>> {
    let mut payload = vec![amount];
    payload.extend_from_slice(&offset.to_le_bytes());
    let mut r = send(Command::List, &payload)?;
    let len = read_u8(&mut r)?;
    (0..len).map(|_| Entry::read(&mut r)).collect()
}