use crate::{error::Result, Bravia, RequestBodyBuilder, RequestBuilder};
use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
const ENDPOINT: &str = "video";
fn bool_true() -> bool {
true
}
fn candidate_f64_default() -> f64 {
-1.0
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Candidate {
#[serde(default)]
pub value: String,
#[serde(default = "candidate_f64_default")]
pub max: f64,
#[serde(default = "candidate_f64_default")]
pub min: f64,
#[serde(default = "candidate_f64_default")]
pub step: f64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PictureQualitySettingsResponse {
pub target: String,
pub current_value: String,
#[serde(default = "bool_true")]
pub is_available: bool,
pub candidate: Option<Vec<Candidate>>,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct PictureQualitySettingsRequest {
pub target: Option<String>,
pub value: Option<String>,
}
impl PictureQualitySettingsRequest {
pub fn new(target: Option<String>, value: Option<String>) -> Self {
Self { target, value }
}
}
pub struct VideoService<'a>(&'a Bravia);
impl<'a> VideoService<'a> {
pub fn new(bravia: &'a Bravia) -> Self {
Self(bravia)
}
pub async fn get_picture_quality_settings(
&self,
target: Option<String>,
) -> Result<Vec<PictureQualitySettingsResponse>> {
let mut params = Map::new();
if let Some(target) = target {
params.insert(String::from("target"), Value::from(target));
}
let body = RequestBodyBuilder::default()
.id(52)
.method("getPictureQualitySettings")
.params(Value::from(params))
.build()?;
let req = RequestBuilder::default()
.endpoint(ENDPOINT)
.body(body)
.has_result()
.make(self.0)
.await?;
Ok(serde_json::from_value(req)?)
}
pub async fn set_picture_quality_settings(
&self,
settings: Vec<PictureQualitySettingsRequest>,
) -> Result<()> {
let mut params = Map::new();
params.insert(String::from("settings"), serde_json::to_value(settings)?);
let body = RequestBodyBuilder::default()
.id(12)
.method("setPictureQualitySettings")
.params(Value::from(params))
.build()?;
RequestBuilder::default()
.endpoint(ENDPOINT)
.body(body)
.is_protected()
.make(self.0)
.await?;
Ok(())
}
}