use crate::{error::Result, Bravia, RequestBodyBuilder, RequestBuilder};
use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
const ENDPOINT: &str = "appControl";
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct Application {
pub title: String,
pub uri: String,
#[serde(default)]
pub icon: String,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct ApplicationStatus {
pub name: String,
pub status: String,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct WebAppStatus {
pub active: bool,
#[serde(default)]
pub url: String,
}
pub struct AppControlService<'a>(&'a Bravia);
impl<'a> AppControlService<'a> {
pub fn new(bravia: &'a Bravia) -> Self {
Self(bravia)
}
pub async fn get_application_list(&self) -> Result<Vec<Application>> {
let body = RequestBodyBuilder::default()
.id(60)
.method("getApplicationList")
.build()?;
let req = RequestBuilder::default()
.endpoint(ENDPOINT)
.body(body)
.is_protected()
.has_result()
.make(self.0)
.await?;
Ok(serde_json::from_value(req)?)
}
pub async fn get_application_status_list(&self) -> Result<Vec<ApplicationStatus>> {
let body = RequestBodyBuilder::default()
.id(55)
.method("getApplicationStatusList")
.build()?;
let req = RequestBuilder::default()
.endpoint(ENDPOINT)
.body(body)
.is_protected()
.has_result()
.make(self.0)
.await?;
Ok(serde_json::from_value(req)?)
}
pub async fn get_text_form(&self, enc_key: Option<String>) -> Result<String> {
let mut params = Map::new();
if let Some(key) = enc_key {
params.insert(String::from("encKey"), Value::from(key));
};
let body = RequestBodyBuilder::default()
.id(60)
.method("getTextForm")
.version(Some("1.1"))
.params(Value::from(params))
.build()?;
let req = RequestBuilder::default()
.endpoint(ENDPOINT)
.body(body)
.is_protected()
.has_result()
.get("text".into())
.make(self.0)
.await?;
Ok(serde_json::from_value(req)?)
}
pub async fn get_web_app_status(&self) -> Result<WebAppStatus> {
let body = RequestBodyBuilder::default()
.id(1)
.method("getWebAppStatus")
.build()?;
let req = RequestBuilder::default()
.endpoint(ENDPOINT)
.body(body)
.is_protected()
.has_result()
.make(self.0)
.await?;
Ok(serde_json::from_value(req)?)
}
pub async fn set_active_app(&self, uri: String) -> Result<()> {
let mut params = Map::new();
params.insert(String::from("uri"), Value::from(uri));
let body = RequestBodyBuilder::default()
.id(601)
.method("setActiveApp")
.params(Value::from(params))
.build()?;
RequestBuilder::default()
.endpoint(ENDPOINT)
.body(body)
.is_protected()
.make(self.0)
.await?;
Ok(())
}
pub async fn set_text_form(
&self,
text: String,
enc_key: Option<String>,
version: Option<&str>,
) -> Result<()> {
let params = if let Some(version) = version {
if version == "1.1" {
let mut map = Map::new();
if let Some(enc_key) = enc_key {
map.insert(String::from("encKey"), Value::from(enc_key));
}
map.insert(String::from("text"), Value::from(text));
Value::from(map)
} else {
Value::from(text)
}
} else {
Value::from(text)
};
let body = RequestBodyBuilder::default()
.id(601)
.method("setTextForm")
.version(version)
.params(params)
.build()?;
RequestBuilder::default()
.endpoint(ENDPOINT)
.body(body)
.is_protected()
.make(self.0)
.await?;
Ok(())
}
pub async fn terminate_apps(&self) -> Result<()> {
let body = RequestBodyBuilder::default()
.id(55)
.method("terminateApps")
.build()?;
RequestBuilder::default()
.endpoint(ENDPOINT)
.body(body)
.is_protected()
.make(self.0)
.await?;
Ok(())
}
}