ftswarm 0.2.5

A simple swarm protocol communication library
Documentation
use ftswarm_macros::{default_new_swarm_object_impls, impl_swarm_object};
use ftswarm_proto::command::argument::Argument;
use ftswarm_proto::command::enums::MicroStepMode;
use ftswarm_proto::command::rpc::RpcFunction;
use crate::FtSwarm;
use crate::swarm_object::{NewSwarmObject, SwarmObject, Updateable};

#[derive(Updateable, Clone)]
pub struct Controller {
    pub name: String,
    swarm: FtSwarm
}

impl_swarm_object!(Controller, ());

impl NewSwarmObject<()> for Controller {
    fn new(name: &str, swarm: FtSwarm, _params: ()) -> Box<Self> {
        Box::new(Controller {
            name: name.to_string(),
            swarm
        })
    }

    default_new_swarm_object_impls!();
}

impl Controller {
    pub async fn show(&self) -> Result<(), String> {
        self.run_command(RpcFunction::Show, vec![])
            .await
            .map(|_| ())
    }

    pub async fn set_micro_step_mode(&self, mode: MicroStepMode) -> Result<(), String> {
        self.run_command(RpcFunction::SetMicroStepMode, vec![Argument::MicroStepMode(mode)])
            .await
            .map(|_| ())
    }

    pub async fn set_register(&self, register: u8, value: u32) -> Result<(), String> {
        self.run_command(RpcFunction::SetRegister, vec![Argument::Int(register as i64), Argument::Int(value as i64)])
            .await
            .map(|_| ())
    }

    pub async fn get_register(&self, register: u8) -> Result<u32, String> {
        self.run_command(RpcFunction::GetRegister, vec![Argument::Int(register as i64)])
            .await
            .and_then(|response| response.as_int().map(|value| value as u32).ok_or("Invalid response".to_string()))
    }
}