roblib-client 0.1.0

A client library for a dank engine
Documentation
pub mod logger;
pub mod transports;

pub use anyhow::Result;
pub use roblib;

#[cfg(feature = "async")]
pub use tokio::main;
#[cfg(feature = "async")]
pub mod async_robot;
#[cfg(feature = "async")]
pub use async_robot::RobotAsync;

#[cfg(feature = "camloc")]
mod camloc;
#[cfg(feature = "gpio")]
mod gpio;
#[cfg(feature = "roland")]
mod roland;

use roblib::{cmd, event::Event, RoblibBuiltin};
use std::time::{Duration, Instant};
use transports::{Subscribable, Transport};

pub struct Robot<T> {
    pub transport: T,
}

impl<T: Transport> Robot<T> {
    pub fn new(transport: T) -> Self {
        Self { transport }
    }

    pub fn measure_latency(&self) -> Result<Duration> {
        let start = Instant::now();
        let _ = self.transport.cmd(cmd::GetUptime)?;
        Ok(Instant::now() - start)
    }
    pub fn get_server_uptime(&self) -> Result<Duration> {
        self.transport.cmd(cmd::GetUptime)
    }
}
impl<T: Subscribable> Robot<T> {
    pub fn subscribe<E: Event>(
        &self,
        ev: E,
        handler: impl FnMut(E::Item) -> Result<()> + Send + Sync + 'static,
    ) -> Result<()> {
        self.transport.subscribe(ev, handler)
    }
    pub fn unsubscribe<E: Event>(&self, ev: E) -> Result<()> {
        self.transport.unsubscribe(ev)
    }
}

impl<T: Transport> RoblibBuiltin for Robot<T> {
    fn nop(&self) -> anyhow::Result<()> {
        self.transport.cmd(cmd::Nop)
    }

    fn get_uptime(&self) -> anyhow::Result<Duration> {
        self.transport.cmd(cmd::GetUptime)
    }

    fn abort(&self) -> anyhow::Result<()> {
        self.transport.cmd(cmd::Abort)
    }
}