use derive_more::*;
use serde::{Deserialize, Serialize};
use std::cmp::{Ordering, PartialEq, PartialOrd};
use std::convert::TryFrom;
use std::fmt::{Debug, Formatter};
use std::num::NonZeroU32;
use std::{borrow::Borrow, ops::Deref};
#[derive(
Debug, Display, Ord, PartialOrd, PartialEq, Eq, Hash, Serialize, Deserialize, Copy, Clone,
)]
pub enum Language {
#[display(fmt = "Unknown")]
Unknown,
#[display(fmt = "English")]
EN,
#[display(fmt = "䌓體中文")]
B5,
#[display(fmt = "简体中文")]
GB,
#[display(fmt = "Français")]
FR,
#[display(fmt = "Deutsch")]
DE,
#[display(fmt = "Italiano")]
IT,
#[display(fmt = "Español")]
ES,
#[display(fmt = "Português")]
PT,
#[display(fmt = "日本語")]
JA,
}
impl Language {
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn is_unknown(&self) -> bool {
*self == Language::Unknown
}
}
impl Default for Language {
fn default() -> Self {
Language::Unknown
}
}
#[derive(
Debug, Display, Ord, PartialOrd, PartialEq, Eq, Hash, Serialize, Deserialize, Copy, Clone,
)]
pub enum OpMode {
Unknown,
Manual,
#[display(fmt = "Semi-Automatic")]
SemiAutomatic,
Automatic,
Others,
#[display(fmt = "Off-Line")]
Offline,
}
impl OpMode {
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn is_unknown(&self) -> bool {
*self == OpMode::Unknown
}
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn is_offline(&self) -> bool {
*self == OpMode::Offline
}
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn is_online(&self) -> bool {
match self {
OpMode::Unknown | OpMode::Offline => false,
_ => true,
}
}
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn is_producing(&self) -> bool {
match self {
OpMode::SemiAutomatic | OpMode::Automatic => true,
_ => false,
}
}
}
impl Default for OpMode {
fn default() -> Self {
OpMode::Unknown
}
}
#[derive(
Debug, Display, Ord, PartialOrd, PartialEq, Eq, Hash, Serialize, Deserialize, Copy, Clone,
)]
pub enum JobMode {
Unknown,
ID01,
ID02,
ID03,
ID04,
ID05,
ID06,
ID07,
ID08,
ID09,
ID10,
ID11,
ID12,
ID13,
ID14,
ID15,
#[display(fmt = "Off-Line")]
Offline,
}
impl JobMode {
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn is_unknown(&self) -> bool {
*self == JobMode::Unknown
}
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn is_offline(&self) -> bool {
*self == JobMode::Offline
}
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn is_online(&self) -> bool {
match self {
JobMode::Unknown | JobMode::Offline => false,
_ => true,
}
}
}
impl Default for JobMode {
fn default() -> Self {
JobMode::Unknown
}
}
#[derive(
AsRef,
AsMut,
Deref,
DerefMut,
Display,
Copy,
Clone,
Ord,
PartialOrd,
Eq,
PartialEq,
Hash,
From,
Into,
FromStr,
Serialize,
Deserialize,
)]
pub struct ID(NonZeroU32);
impl ID {
pub fn new(value: u32) -> Option<Self> {
Self::try_from(value).ok()
}
pub fn from_u32(value: u32) -> Self {
Self::try_from(value).unwrap()
}
pub fn get(self) -> u32 {
self.0.get()
}
}
impl Debug for ID {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", &self.0)
}
}
impl TryFrom<u32> for ID {
type Error = &'static str;
fn try_from(value: u32) -> Result<Self, Self::Error> {
NonZeroU32::new(value).map(Self).ok_or("ID value cannot be zero.")
}
}
impl From<ID> for u32 {
fn from(id: ID) -> Self {
id.get()
}
}
impl PartialEq<u32> for ID {
fn eq(&self, other: &u32) -> bool {
self.get() == *other
}
}
impl PartialEq<ID> for u32 {
fn eq(&self, other: &ID) -> bool {
*self == other.get()
}
}
impl PartialOrd<u32> for ID {
fn partial_cmp(&self, other: &u32) -> Option<Ordering> {
self.get().partial_cmp(other)
}
}
impl PartialOrd<ID> for u32 {
fn partial_cmp(&self, other: &ID) -> Option<Ordering> {
self.partial_cmp(&other.get())
}
}
#[derive(
AsRef,
AsMut,
DerefMut,
Display,
Constructor,
Copy,
Clone,
Ord,
PartialOrd,
Eq,
PartialEq,
Hash,
From,
Into,
FromStr,
Serialize,
Deserialize,
)]
pub struct ActionID(i32);
impl Deref for ActionID {
type Target = i32;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl Borrow<i32> for ActionID {
fn borrow(&self) -> &i32 {
&self.0
}
}
impl Debug for ActionID {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", &self.0)
}
}
impl PartialEq<i32> for ActionID {
fn eq(&self, other: &i32) -> bool {
self.0 == *other
}
}
impl PartialEq<ActionID> for i32 {
fn eq(&self, other: &ActionID) -> bool {
*self == other.0
}
}
impl PartialOrd<i32> for ActionID {
fn partial_cmp(&self, other: &i32) -> Option<Ordering> {
self.0.partial_cmp(other)
}
}
impl PartialOrd<ActionID> for i32 {
fn partial_cmp(&self, other: &ActionID) -> Option<Ordering> {
self.partial_cmp(&other.0)
}
}