use std::{convert::Infallible, num::NonZeroU32};
use thiserror::Error;
use uuid::Uuid;
use crate::{
client::{DeviceBase, HlapiClient, HlapiClientError},
devices::robot::RobotSide,
};
#[derive(Debug, Clone)]
pub struct BlockOperations {
client: HlapiClient,
uuid: Uuid,
}
#[non_exhaustive]
#[derive(Error, Debug)]
pub enum BlockOperationsError {
#[error("HLAPI client error: {0}")]
HlapiClientError(#[from] HlapiClientError),
#[error("Operation failed")]
OperationFailed,
}
impl BlockOperations {
pub fn durability(&self) -> Result<Option<NonZeroU32>, BlockOperationsError> {
let raw = self.call("durability", &[], &[])?.0;
Ok(NonZeroU32::new(raw))
}
pub fn excavate(&self, side: Option<RobotSide>) -> Result<(), BlockOperationsError> {
if self.call("excavate", &[&side as _], &[])?.0 {
Ok(())
} else {
Err(BlockOperationsError::OperationFailed)
}
}
pub fn place(&self, side: Option<RobotSide>) -> Result<(), BlockOperationsError> {
if self.call("place", &[&side as _], &[])?.0 {
Ok(())
} else {
Err(BlockOperationsError::OperationFailed)
}
}
}
impl DeviceBase for BlockOperations {
const TYPE: &'static str = "block_operations";
type Event = Infallible;
fn new(client: HlapiClient, uuid: Uuid) -> Result<Self, HlapiClientError> {
Ok(Self { client, uuid })
}
fn uuid_base(&self) -> Uuid {
self.uuid
}
fn client(&self) -> &HlapiClient {
&self.client
}
}