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::rpc::RpcFunction;
use crate::FtSwarm;
use crate::swarm_object::{NewSwarmObject, SwarmObject, Updateable};

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

impl_swarm_object!(Servo, ());

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

    default_new_swarm_object_impls!();
}

impl Servo {
    pub async fn get_position(&self) -> Result<i32, String> {
        self.run_command(RpcFunction::GetPosition, vec![])
            .await
            .and_then(|param| param.as_int().ok_or("Invalid response".to_string()))
    }

    pub async fn set_position(&self, position: i32) -> Result<(), String> {
        self.run_command(RpcFunction::SetPosition, vec![Argument::Int(position as i64)])
            .await
            .map(|_| ())
    }

    pub async fn get_offset(&self) -> Result<i32, String> {
        self.run_command(RpcFunction::GetOffset, vec![])
            .await
            .and_then(|param| param.as_int().ok_or("Invalid response".to_string()))
    }

    pub async fn set_offset(&self, offset: i32) -> Result<(), String> {
        self.run_command(RpcFunction::SetOffset, vec![Argument::Int(offset as i64)])
            .await
            .map(|_| ())
    }
}