huehue 0.5.0

Rust wrapper for Hue v2 API.
Documentation
use crate::color::{Color, Component, Temperature, RGB8};
use crate::http::HueError;
use crate::models::lights::{GetLightsResponseItem, LightOnRequest, LightSetBrightnessRequest, LightSetColorRequest};
use crate::models::GenericResponse;
use crate::{http, Hue};

pub type Lights = Vec<Light>;

#[derive(Debug, Clone)]
pub struct Light {
	pub hue: Hue,
	pub id: uuid::Uuid,
	pub name: String,
	pub on: bool,
	pub brightness: Option<f32>,
	pub color: Option<Color>,
	pub temperature: Option<Temperature>,
}

impl Light {
	pub fn new(hue: &Hue, light: GetLightsResponseItem) -> Light {
		Light {
			hue: hue.clone(),
			id: light.id,
			name: light.metadata.name,
			on: light.on.on,
			brightness: light.dimming.map(|dimming| dimming.brightness),
			color: light.color,
			temperature: light.color_temperature,
		}
	}

	pub async fn switch(&mut self, on: bool) -> Result<(), HueError> {
		let url = self.hue.url(format!("clip/v2/resource/light/{}", self.id).as_str());
		let application_key = self.hue.application_key().clone().unwrap();
		let request_payload = LightOnRequest::new(on);

		match http::put_auth::<GenericResponse, LightOnRequest>(application_key, url, &request_payload).await {
			Ok(_) => {
				self.on = on;
				Ok(())
			},
			Err(e) => Err(e),
		}
	}

	pub async fn set_color(&mut self, component: Component) -> Result<(), HueError> {
		if self.color.is_none() {
			return Err(HueError::Unsupported);
		}

		let url = self.hue.url(format!("clip/v2/resource/light/{}", self.id).as_str());
		let application_key = self.hue.application_key().clone().unwrap();
		let request_payload = LightSetColorRequest::new(component.clone());

		match http::put_auth::<GenericResponse, LightSetColorRequest>(application_key, url, &request_payload).await {
			Ok(_) => {
				if let Some(color) = &mut self.color {
					color.xy = component;
				}
				Ok(())
			},
			Err(e) => Err(e),
		}
	}

	pub async fn set_color_rgb(&mut self, rgb: RGB8) -> Result<(), HueError> {
		if let Some(color) = &self.color {
			let xy = color.gamut.xy_from_rgb8(rgb);
			self.set_color(xy).await
		} else {
			Err(HueError::Unsupported)
		}
	}

	pub async fn dimm(&mut self, value: f32) -> Result<(), HueError> {
		if self.brightness.is_none() {
			return Err(HueError::Unsupported);
		}

		let url = self.hue.url(format!("clip/v2/resource/light/{}", self.id).as_str());
		let application_key = self.hue.application_key().clone().unwrap();
		let request_payload = LightSetBrightnessRequest::new(value.clone());

		match http::put_auth::<GenericResponse, LightSetBrightnessRequest>(application_key, url, &request_payload).await
		{
			Ok(_) => {
				if let Some(brightness) = &mut self.brightness {
					*brightness = value;
				}
				Ok(())
			},
			Err(e) => Err(e),
		}
	}
}