use crate::{gstd_types, resources, Error};
use reqwest::{Client, Response};
use url::Url;
#[derive(Debug, Clone)]
pub struct GstClient {
http_client: Client,
base_url: Url,
}
impl GstClient {
pub fn build<S: Into<String>>(base_url: S) -> Result<Self, Error> {
Ok(Self {
http_client: Client::new(),
base_url: Url::parse(&base_url.into()).map_err(Error::IncorrectBaseUrl)?,
})
}
pub(crate) async fn get(&self, url: &str) -> Result<Response, Error> {
self.http_client
.get(self.base_url.join(url).map_err(Error::IncorrectApiUrl)?)
.send()
.await
.map_err(Error::RequestFailed)
}
pub(crate) async fn post(&self, url: &str) -> Result<Response, Error> {
self.http_client
.post(self.base_url.join(url).map_err(Error::IncorrectApiUrl)?)
.send()
.await
.map_err(Error::RequestFailed)
}
pub(crate) async fn put(&self, url: &str) -> Result<Response, Error> {
self.http_client
.put(self.base_url.join(url).map_err(Error::IncorrectApiUrl)?)
.send()
.await
.map_err(Error::RequestFailed)
}
pub(crate) async fn delete(&self, url: &str) -> Result<Response, Error> {
self.http_client
.put(self.base_url.join(url).map_err(Error::IncorrectApiUrl)?)
.send()
.await
.map_err(Error::RequestFailed)
}
pub(crate) async fn process_resp(&self, resp: Response) -> Result<gstd_types::Response, Error> {
if !resp.status().is_success() {
return Err(Error::BadStatus(resp.status()));
}
let res = resp
.json::<gstd_types::Response>()
.await
.map_err(Error::BadBody)?;
if res.code != gstd_types::ResponseCode::Success {
return Err(Error::GstdError(res.code));
}
Ok(res)
}
pub async fn pipelines(&self) -> Result<gstd_types::Response, Error> {
let resp = self.get("pipelines").await?;
self.process_resp(resp).await
}
#[must_use]
pub fn pipeline<S>(&self, name: S) -> resources::Pipeline
where
S: Into<String>,
{
resources::Pipeline::new(name, self)
}
#[must_use]
pub fn debug(&self) -> resources::Debug {
resources::Debug::new(self)
}
}
impl Default for GstClient {
fn default() -> Self {
Self {
http_client: Client::new(),
base_url: Url::parse("http://127.0.0.1:5000").unwrap(),
}
}
}
#[cfg(test)]
mod spec {
use super::*;
const BASE_URL: &'static str = "http://10.211.55.4:5000";
#[tokio::test]
async fn retrieve_pipelines() {
if let Ok(client) = GstClient::build(&BASE_URL) {
let res = client.pipelines().await;
println!("{:?}", res);
assert!(res.is_ok());
};
}
#[tokio::test]
async fn retrieve_pipeline_graph() {
if let Ok(client) = GstClient::build(&BASE_URL) {
let res = client.pipeline("test-pipeline").graph().await;
println!("{:?}", res);
assert!(res.is_ok());
};
}
#[tokio::test]
async fn retrieve_pipeline_elements() {
if let Ok(client) = GstClient::build(&BASE_URL) {
let res = client.pipeline("test-pipeline").elements().await;
println!("{:?}", res);
assert!(res.is_ok());
};
}
#[tokio::test]
async fn retrieve_pipeline_properties() {
if let Ok(client) = GstClient::build(&BASE_URL) {
let res = client.pipeline("test-pipeline").properties().await;
println!("{:?}", res);
assert!(res.is_ok());
};
}
#[tokio::test]
async fn retrieve_pipeline_element_property() {
if let Ok(client) = GstClient::build(&BASE_URL) {
let res = client
.pipeline("test-pipeline")
.element("rtmp2src")
.property("location")
.await;
println!("{:?}", res);
assert!(res.is_ok());
};
}
#[tokio::test]
async fn retrieve_pipeline_bus_read() {
if let Ok(client) = GstClient::build(&BASE_URL) {
let res = client.pipeline("test-pipeline").bus().read().await;
println!("{:?}", res);
assert!(res.is_ok());
};
}
}