miku-rpc 0.1.4

an implementation of the opencomputers 2 RPC api
Documentation
use crate::Response;
use miniserde_miku::de::Visitor;
use miniserde_miku::ser::Fragment;
use miniserde_miku::{make_place, Deserialize, Result as MiniserdeResult, Serialize};
use std::borrow::Cow;

make_place!(Place);

pub type DeviceList = Response<Vec<DeviceData>>;

#[derive(Serialize, Deserialize, Debug)]
pub struct DeviceData {
    #[serde(rename = "deviceId")]
    pub device_id: String,
    #[serde(rename = "typeNames")]
    pub type_names: Vec<String>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct ImportFileInfo {
    pub name: String,
    pub size: u64,
}

#[derive(Copy, Clone, Debug, PartialEq)]
pub enum RobotActionResult {
    Incomplete,
    Success,
    Failure,
}

impl Visitor for Place<RobotActionResult> {
    fn string(&mut self, s: &str) -> MiniserdeResult<()> {
        self.out = match s {
            "INCOMPLETE" => Some(RobotActionResult::Incomplete),
            "SUCCESS" => Some(RobotActionResult::Success),
            "FAILURE" => Some(RobotActionResult::Failure),
            _ => None,
        };

        Ok(())
    }
}

impl Deserialize for RobotActionResult {
    fn begin(out: &mut Option<Self>) -> &mut dyn Visitor {
        Place::new(out)
    }
}

#[derive(Copy, Clone, PartialEq, Debug)]
pub enum MoveDirection {
    Forward,
    Backward,
    Upward,
    Downward,
    Left,
    Right,
}

impl AsRef<str> for MoveDirection {
    fn as_ref(&self) -> &'static str {
        use MoveDirection::*;

        match self {
            Forward => "forward",
            Backward => "backward",
            Upward => "upward",
            Downward => "downward",
            Left => "left",
            Right => "right",
        }
    }
}

impl Serialize for MoveDirection {
    fn begin(&self) -> Fragment {
        Fragment::Str(Cow::Borrowed(self.as_ref()))
    }
}

#[derive(Copy, Clone, PartialEq, Debug)]
pub enum RotationDirection {
    Left,
    Right,
}

impl Serialize for RotationDirection {
    fn begin(&self) -> Fragment {
        Fragment::Str(Cow::Borrowed(self.as_ref()))
    }
}

impl AsRef<str> for RotationDirection {
    fn as_ref(&self) -> &'static str {
        use RotationDirection::*;

        match self {
            Left => "left",
            Right => "right",
        }
    }
}