Removed the DeviceIdentifier
trait, and Device
now returns a String.
This commit is contained in:
parent
4c93786f1c
commit
4b95734faf
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "luxafor"
|
||||
description = "Library, and CLI, for Luxafor lights via either USB or webhooks."
|
||||
version = "0.2.0"
|
||||
version = "0.2.1"
|
||||
authors = ["Simon Johnston <johnstonskj@gmail.com>"]
|
||||
repository = "https://github.com/johnstonskj/rust-luxafor"
|
||||
documentation = "https://docs.rs/luxafor/0.1.0/luxafor/"
|
||||
|
12
README.md
12
README.md
@ -9,8 +9,12 @@ Library, and CLI, for [Luxafor](https://luxafor.com/products/) lights via either
|
||||

|
||||
[](https://github.com/johnstonskj/rust-luxafor/stargazers)
|
||||
|
||||
This has been tested with the USB connected [flag](https://luxafor.com/flag-usb-busylight-availability-indicator/)
|
||||
as well as the [Bluetooth](https://luxafor.com/bluetooth-busy-light-availability-indicator/) lights.
|
||||
The main entry point for clients is the trait `Device` that has implementations for USB connected devices such as the
|
||||
[flag](https://luxafor.com/flag-usb-busylight-availability-indicator/) as well as webhooks for both the flag and
|
||||
[bluetooth](https://luxafor.com/bluetooth-busy-light-availability-indicator/) lights.
|
||||
|
||||
Each connection has its own discovery or connection methods but will provide a `Device` implementation
|
||||
for the manipulation of the light state.
|
||||
|
||||
## API Examples
|
||||
|
||||
@ -76,6 +80,10 @@ The following shows the command line tool turning the light off.
|
||||
|
||||
## Changes
|
||||
|
||||
**Version 0.2.1**
|
||||
|
||||
* Removed the `DeviceIdentifier` trait, and `Device` now returns a String.
|
||||
|
||||
**Version 0.2.0**
|
||||
|
||||
* Refactored to provide a new `Device` trait
|
||||
|
16
src/lib.rs
16
src/lib.rs
@ -1,10 +1,13 @@
|
||||
/*!
|
||||
Library, and CLI, for [Luxafor](https://luxafor.com/products/) lights via either USB or webhooks.
|
||||
|
||||
This has been
|
||||
tested with the USB connected [flag](https://luxafor.com/flag-usb-busylight-availability-indicator/)
|
||||
as well as the [Bluetooth](https://luxafor.com/bluetooth-busy-light-availability-indicator/) lights.
|
||||
The main entry point for clients is the trait [Device](trait.Device.html) that has implementations
|
||||
for USB connected devices such as the [flag](https://luxafor.com/flag-usb-busylight-availability-indicator/)
|
||||
as well as webhooks for both the flag and [bluetooth](https://luxafor.com/bluetooth-busy-light-availability-indicator/)
|
||||
lights.
|
||||
|
||||
Each connection has its own discovery or connection methods but will provide a `Device` implementation
|
||||
for the manipulation of the light state.
|
||||
|
||||
# API Examples
|
||||
|
||||
@ -160,11 +163,6 @@ pub enum Pattern {
|
||||
Synthetic,
|
||||
}
|
||||
|
||||
///
|
||||
/// Trait describing a device identifier, basically you just need to be able to `to_string()` it.
|
||||
///
|
||||
pub trait DeviceIdentifier: Display {}
|
||||
|
||||
///
|
||||
/// A trait implemented by different access methods to control a light.
|
||||
///
|
||||
@ -172,7 +170,7 @@ pub trait Device {
|
||||
///
|
||||
/// Return the identifier for the device.
|
||||
///
|
||||
fn id(&self) -> &dyn DeviceIdentifier;
|
||||
fn id(&self) -> String;
|
||||
|
||||
///
|
||||
/// Turn the light off.
|
||||
|
@ -2,9 +2,8 @@
|
||||
Implementation of the Device trait for USB connected lights.
|
||||
*/
|
||||
|
||||
use crate::{Device, DeviceIdentifier, Pattern, SolidColor};
|
||||
use crate::{Device, Pattern, SolidColor};
|
||||
use hidapi::{HidApi, HidDevice};
|
||||
use std::fmt::{Display, Formatter};
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Public Types
|
||||
@ -18,19 +17,13 @@ pub struct USBDeviceDiscovery {
|
||||
hid_api: HidApi,
|
||||
}
|
||||
|
||||
///
|
||||
/// The device identifier for a USB connected light.
|
||||
///
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct USBDeviceID(String);
|
||||
|
||||
///
|
||||
/// The device implementation for a USB connected light.
|
||||
///
|
||||
#[allow(missing_debug_implementations)]
|
||||
pub struct USBDevice<'a> {
|
||||
hid_device: HidDevice<'a>,
|
||||
id: USBDeviceID,
|
||||
id: String,
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
@ -83,16 +76,6 @@ const PATTERN_RAINBOW_WAVE: u8 = 8;
|
||||
// Implementations
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
||||
impl Display for USBDeviceID {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "{}", self.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl DeviceIdentifier for USBDeviceID {}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
||||
impl USBDeviceDiscovery {
|
||||
///
|
||||
/// Construct a new discovery object, this initializes the USB HID interface and thus can fail.
|
||||
@ -120,8 +103,8 @@ impl USBDeviceDiscovery {
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
||||
impl<'a> Device for USBDevice<'a> {
|
||||
fn id(&self) -> &dyn DeviceIdentifier {
|
||||
&self.id
|
||||
fn id(&self) -> String {
|
||||
self.id.clone()
|
||||
}
|
||||
|
||||
fn turn_off(&self) -> crate::error::Result<()> {
|
||||
@ -189,7 +172,7 @@ impl<'a> Device for USBDevice<'a> {
|
||||
|
||||
impl<'a> USBDevice<'a> {
|
||||
fn new(hid_device: HidDevice<'a>) -> crate::error::Result<USBDevice<'a>> {
|
||||
let id = USBDeviceID(format!(
|
||||
let id = format!(
|
||||
"{}::{}::{}",
|
||||
hid_device
|
||||
.get_manufacturer_string()
|
||||
@ -200,7 +183,7 @@ impl<'a> USBDevice<'a> {
|
||||
hid_device
|
||||
.get_serial_number_string()
|
||||
.unwrap_or("<unknown>".to_string())
|
||||
));
|
||||
);
|
||||
Ok(Self { hid_device, id })
|
||||
}
|
||||
}
|
||||
|
@ -3,27 +3,19 @@ Implementation of the Device trait for webhook connected lights.
|
||||
|
||||
*/
|
||||
|
||||
use crate::{Device, DeviceIdentifier, Pattern, SolidColor};
|
||||
use crate::{Device, Pattern, SolidColor};
|
||||
use reqwest::blocking::Client;
|
||||
use std::fmt::{Display, Formatter};
|
||||
use std::str::FromStr;
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Public Types
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
||||
///
|
||||
/// The device identifier for a webhook connected light.
|
||||
///
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct WebhookDeviceID(String);
|
||||
|
||||
///
|
||||
/// The device implementation for a webhook connected light.
|
||||
///
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct WebhookDevice {
|
||||
id: WebhookDeviceID,
|
||||
id: String,
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
@ -34,8 +26,13 @@ pub struct WebhookDevice {
|
||||
/// Return a device implementation for a webhook connected light.
|
||||
///
|
||||
pub fn new_device_for(device_id: &str) -> crate::error::Result<impl Device> {
|
||||
let device_id = WebhookDeviceID::from_str(device_id)?;
|
||||
Ok(WebhookDevice { id: device_id })
|
||||
if !device_id.is_empty() && device_id.chars().all(|c| c.is_ascii_hexdigit()) {
|
||||
Ok(WebhookDevice {
|
||||
id: device_id.to_string(),
|
||||
})
|
||||
} else {
|
||||
Err(crate::error::ErrorKind::InvalidDeviceID.into())
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
@ -48,31 +45,9 @@ const API_V1: &str = "https://api.luxafor.com/webhook/v1/actions";
|
||||
// Implementations
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
||||
impl Display for WebhookDeviceID {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "{}", self.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl DeviceIdentifier for WebhookDeviceID {}
|
||||
|
||||
impl FromStr for WebhookDeviceID {
|
||||
type Err = crate::error::Error;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
if !s.is_empty() && s.chars().all(|c| c.is_ascii_hexdigit()) {
|
||||
Ok(Self(s.to_string()))
|
||||
} else {
|
||||
Err(crate::error::ErrorKind::InvalidDeviceID.into())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
||||
impl Device for WebhookDevice {
|
||||
fn id(&self) -> &dyn DeviceIdentifier {
|
||||
&self.id
|
||||
fn id(&self) -> String {
|
||||
self.id.clone()
|
||||
}
|
||||
|
||||
fn turn_off(&self) -> crate::error::Result<()> {
|
||||
|
Loading…
Reference in New Issue
Block a user