use std::collections::BTreeMap;
use async_trait::async_trait;
use rmpv::Value;
use super::{Bus, DriverResult};
#[derive(Debug, Clone, PartialEq)]
pub struct PayloadCandidate {
pub driver_id: String,
pub device_id: String,
pub label: String,
pub bus: Bus,
pub vid_pid: Option<(u16, u16)>,
pub metadata: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct PayloadCapabilities {
pub actions: Vec<String>,
pub has_position_feedback: bool,
pub has_flow_feedback: bool,
pub metadata: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct PayloadCommand {
pub action_id: String,
pub args: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct PayloadState {
pub timestamp_ns: i64,
pub last_action_id: Option<String>,
pub busy: bool,
pub metadata: BTreeMap<String, Value>,
}
#[async_trait]
pub trait PayloadActuatorDriver: Send + Sync {
type Session: Send + Sync;
async fn discover(&self) -> DriverResult<Vec<PayloadCandidate>>;
async fn open(
&self,
candidate: &PayloadCandidate,
config: &BTreeMap<String, Value>,
) -> DriverResult<Self::Session>;
async fn close(&self, session: Self::Session) -> DriverResult<()>;
fn capabilities(&self, session: &Self::Session) -> PayloadCapabilities;
async fn actuate(&self, session: &Self::Session, command: &PayloadCommand) -> DriverResult<()>;
fn get_state(&self, session: &Self::Session) -> PayloadState;
}