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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user