mod generic;
mod huntsman;
pub use generic::{GenericDevice, GenericMethods};
pub use huntsman::Huntsman;
use crate::capabilities::{
AvailableCapabilities, BreathEffect, Brightness, CapabilityBase, CustomEffect, GameMode,
KeyboardLayout, MacroEffect, MacroMode, MatrixDimensions, NoEffect, ReactiveEffect,
RippleEffect, SpectrumEffect, StarlightEffect, StaticEffect, WaveEffect,
};
#[derive(Debug, Clone)]
pub enum Device {
Huntsman(Huntsman),
Other(GenericDevice),
}
impl Device {
fn capabilities(&self) -> AvailableCapabilities {
self.get_generic_device().available
}
fn capability_base(&self) -> CapabilityBase {
self.get_generic_device().capability_base()
}
pub fn breath_effect(&self) -> Option<BreathEffect> {
let availability = self.capabilities().breath_effect;
if availability.is_available() {
Some(BreathEffect {
base: self.capability_base(),
availability,
})
} else {
None
}
}
pub fn custom_effect(&self) -> Option<CustomEffect> {
let availability = self.capabilities().custom_effect;
if availability.is_available() {
Some(CustomEffect {
base: self.capability_base(),
availability,
})
} else {
None
}
}
pub fn brightness(&self) -> Option<Brightness> {
if self.capabilities().brightness {
Some(Brightness(self.capability_base()))
} else {
None
}
}
pub fn game_mode(&self) -> Option<GameMode> {
if self.capabilities().game_mode {
Some(GameMode(self.capability_base()))
} else {
None
}
}
pub fn keyboard_layout(&self) -> Option<KeyboardLayout> {
if self.capabilities().keyboard_layout {
Some(KeyboardLayout(self.capability_base()))
} else {
None
}
}
pub fn macro_effect(&self) -> Option<MacroEffect> {
if self.capabilities().macro_effect {
Some(MacroEffect(self.capability_base()))
} else {
None
}
}
pub fn macro_mode(&self) -> Option<MacroMode> {
if self.capabilities().macro_mode {
Some(MacroMode(self.capability_base()))
} else {
None
}
}
pub fn matrix_dimensions(&self) -> Option<MatrixDimensions> {
if self.capabilities().matrix_dimensions {
Some(MatrixDimensions(self.capability_base()))
} else {
None
}
}
pub fn no_effect(&self) -> Option<NoEffect> {
if self.capabilities().no_effect {
Some(NoEffect(self.capability_base()))
} else {
None
}
}
pub fn reactive_effect(&self) -> Option<ReactiveEffect> {
if self.capabilities().reactive_effect {
Some(ReactiveEffect(self.capability_base()))
} else {
None
}
}
pub fn ripple_effect(&self) -> Option<RippleEffect> {
let availability = self.capabilities().ripple_effect;
if availability.is_available() {
Some(RippleEffect {
base: self.capability_base(),
availability,
})
} else {
None
}
}
pub fn spectrum_effect(&self) -> Option<SpectrumEffect> {
if self.capabilities().spectrum_effect {
Some(SpectrumEffect(self.capability_base()))
} else {
None
}
}
pub fn starlight_effect(&self) -> Option<StarlightEffect> {
let availability = self.capabilities().starlight_effect;
if availability.is_available() {
Some(StarlightEffect {
base: self.capability_base(),
availability,
})
} else {
None
}
}
pub fn static_effect(&self) -> Option<StaticEffect> {
if self.capabilities().static_effect {
Some(StaticEffect(self.capability_base()))
} else {
None
}
}
pub fn wave_effect(&self) -> Option<WaveEffect> {
if self.capabilities().wave_effect {
Some(WaveEffect(self.capability_base()))
} else {
None
}
}
}
impl GenericMethods for Device {
fn get_generic_device(&self) -> &GenericDevice {
match self {
Device::Huntsman(Huntsman(device)) => device,
Device::Other(device) => device,
}
}
}