use std::convert::Infallible;
use serde::{Deserialize, Serialize};
use thiserror::Error;
use uuid::Uuid;
use crate::{
client::{DeviceBase, HlapiClient, HlapiClientError},
devices::Color,
};
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[serde(rename_all = "camelCase")]
pub enum SignSide {
Front,
Back,
}
#[derive(Debug, Clone)]
pub struct Sign {
client: HlapiClient,
uuid: Uuid,
}
#[non_exhaustive]
#[derive(Error, Debug)]
pub enum SignError {
#[error("HLAPI client error: {0}")]
HlapiClientError(#[from] HlapiClientError),
#[error("Too many lines of text")]
TooManyLines,
}
impl Sign {
pub fn get_color(&self, side: SignSide) -> Result<Color, SignError> {
Ok(self.call("getColor", &[&side as _], &[])?.0)
}
pub fn get_text(&self, side: SignSide) -> Result<Vec<String>, SignError> {
Ok(self.call("getText", &[&side as _], &[])?.0)
}
pub fn is_glowing(&self, side: SignSide) -> Result<bool, SignError> {
Ok(self.call("isGlowing", &[&side as _], &[])?.0)
}
pub fn is_readonly(&self) -> Result<bool, SignError> {
Ok(self.call("isReadonly", &[], &[])?.0)
}
pub fn set_text(&self, side: SignSide, lines: &[&str]) -> Result<(), SignError> {
if lines.len() > 4 {
return Err(SignError::TooManyLines);
}
self.call::<()>("setText", &[&side as _, &lines as _], &[])?;
Ok(())
}
}
impl DeviceBase for Sign {
const TYPE: &'static str = "sign";
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
}
}