use crate::{
gstd_types,
resources::{bus::PipelineBus, element::PipelineElement},
Error, GstClient,
};
use std::fmt::Display;
#[derive(Debug, Clone)]
pub struct Pipeline {
pub name: String,
pub(crate) client: GstClient,
}
impl Pipeline {
pub(crate) fn new<S: Into<String>>(name: S, client: &GstClient) -> Self {
Self {
name: name.into(),
client: client.clone(),
}
}
pub async fn create<S: Into<String>>(
&self,
description: S,
) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.post(&format!(
"pipelines?name={}&description={}",
self.name,
description.into()
))
.await?;
self.client.process_resp(resp).await
}
pub async fn graph(&self) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.get(&format!("pipelines/{}/graph", self.name))
.await?;
self.client.process_resp(resp).await
}
pub async fn elements(&self) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.get(&format!("pipelines/{}/elements", self.name))
.await?;
self.client.process_resp(resp).await
}
pub async fn properties(&self) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.get(&format!("pipelines/{}/properties", self.name))
.await?;
self.client.process_resp(resp).await
}
#[must_use]
pub fn element<S: Into<String>>(&self, name: S) -> PipelineElement {
PipelineElement::new(name, self)
}
#[must_use]
pub fn bus(&self) -> PipelineBus {
PipelineBus::new(self)
}
pub async fn emit_event<S: Into<String> + Display>(
&self,
name: S,
) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.post(&format!("pipelines/{}/event?name={name}", self.name))
.await?;
self.client.process_resp(resp).await
}
pub async fn emit_event_eos(&self) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.post(&format!("pipelines/{}/event?name=eos", self.name))
.await?;
self.client.process_resp(resp).await
}
pub async fn emit_event_flush_start(&self) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.post(&format!("pipelines/{}/event?name=flush_start", self.name))
.await?;
self.client.process_resp(resp).await
}
pub async fn emit_event_flush_stop(&self) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.post(&format!("pipelines/{}/event?name=flush_stop", self.name))
.await?;
self.client.process_resp(resp).await
}
pub async fn play(&self) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.put(&format!("pipelines/{}/state?name=playing", self.name))
.await?;
self.client.process_resp(resp).await
}
pub async fn pause(&self) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.put(&format!("pipelines/{}/state?name=paused", self.name))
.await?;
self.client.process_resp(resp).await
}
pub async fn stop(&self) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.put(&format!("pipelines/{}/state?name=null", self.name))
.await?;
self.client.process_resp(resp).await
}
pub async fn set_verbose(&self, value: bool) -> Result<gstd_types::SuccessResponse, Error> {
let val = if value { "true" } else { "false" };
let resp = self
.client
.put(&format!("pipelines/{}/verbose?name={val}", self.name))
.await?;
self.client.process_resp(resp).await
}
pub async fn delete(&self) -> Result<gstd_types::SuccessResponse, Error> {
let resp = self
.client
.delete(&format!("pipelines?name={}", self.name))
.await?;
self.client.process_resp(resp).await
}
}