use gst::glib;
use gst::prelude::*;
use gst::subclass::prelude::ObjectSubclassIsExt;
pub mod imp;
glib::wrapper! {
pub struct ZenohSink(ObjectSubclass<imp::ZenohSink>) @extends gst_base::BaseSink, gst::Element, gst::Object, @implements gst::URIHandler;
}
unsafe impl Send for ZenohSink {}
unsafe impl Sync for ZenohSink {}
impl Default for ZenohSink {
fn default() -> Self {
gst::Object::builder().build().unwrap()
}
}
impl ZenohSink {
pub fn new(key_expr: &str) -> Self {
gst::Object::builder()
.property("key-expr", key_expr)
.build()
.unwrap()
}
pub fn builder(key_expr: &str) -> ZenohSinkBuilder {
ZenohSinkBuilder::new(key_expr)
}
pub fn set_key_expr(&self, key_expr: &str) {
self.set_property("key-expr", key_expr);
}
pub fn set_config(&self, config_path: &str) {
self.set_property("config", config_path);
}
pub fn set_priority(&self, priority: u32) {
self.set_property("priority", priority);
}
pub fn set_congestion_control(&self, mode: &str) {
self.set_property("congestion-control", mode);
}
pub fn set_reliability(&self, mode: &str) {
self.set_property("reliability", mode);
}
pub fn set_express(&self, express: bool) {
self.set_property("express", express);
}
pub fn set_send_caps(&self, send_caps: bool) {
self.set_property("send-caps", send_caps);
}
pub fn set_caps_interval(&self, interval: u32) {
self.set_property("caps-interval", interval);
}
pub fn set_send_buffer_meta(&self, send: bool) {
self.set_property("send-buffer-meta", send);
}
pub fn set_session(&self, session: zenoh::Session) {
self.imp().set_external_session(session);
}
pub fn set_session_group(&self, group: &str) {
self.set_property("session-group", group);
}
pub fn key_expr(&self) -> String {
self.property("key-expr")
}
pub fn config(&self) -> Option<String> {
self.property("config")
}
pub fn priority(&self) -> u32 {
self.property("priority")
}
pub fn congestion_control(&self) -> String {
self.property("congestion-control")
}
pub fn reliability(&self) -> String {
self.property("reliability")
}
pub fn express(&self) -> bool {
self.property("express")
}
pub fn send_caps(&self) -> bool {
self.property("send-caps")
}
pub fn caps_interval(&self) -> u32 {
self.property("caps-interval")
}
pub fn send_buffer_meta(&self) -> bool {
self.property("send-buffer-meta")
}
pub fn session_group(&self) -> Option<String> {
self.property("session-group")
}
pub fn bytes_sent(&self) -> u64 {
self.property("bytes-sent")
}
pub fn messages_sent(&self) -> u64 {
self.property("messages-sent")
}
pub fn errors(&self) -> u64 {
self.property("errors")
}
pub fn dropped(&self) -> u64 {
self.property("dropped")
}
}
impl TryFrom<gst::Element> for ZenohSink {
type Error = gst::Element;
fn try_from(element: gst::Element) -> Result<Self, Self::Error> {
element.downcast()
}
}
pub struct ZenohSinkBuilder {
key_expr: String,
config: Option<String>,
priority: Option<u32>,
congestion_control: Option<String>,
reliability: Option<String>,
express: Option<bool>,
send_caps: Option<bool>,
caps_interval: Option<u32>,
send_buffer_meta: Option<bool>,
session: Option<zenoh::Session>,
session_group: Option<String>,
}
impl ZenohSinkBuilder {
pub fn new(key_expr: &str) -> Self {
Self {
key_expr: key_expr.to_string(),
config: None,
priority: None,
congestion_control: None,
reliability: None,
express: None,
send_caps: None,
caps_interval: None,
send_buffer_meta: None,
session: None,
session_group: None,
}
}
pub fn config(mut self, path: &str) -> Self {
self.config = Some(path.to_string());
self
}
pub fn priority(mut self, priority: u32) -> Self {
self.priority = Some(priority);
self
}
pub fn congestion_control(mut self, mode: &str) -> Self {
self.congestion_control = Some(mode.to_string());
self
}
pub fn reliability(mut self, mode: &str) -> Self {
self.reliability = Some(mode.to_string());
self
}
pub fn express(mut self, express: bool) -> Self {
self.express = Some(express);
self
}
pub fn send_caps(mut self, send: bool) -> Self {
self.send_caps = Some(send);
self
}
pub fn caps_interval(mut self, interval: u32) -> Self {
self.caps_interval = Some(interval);
self
}
pub fn send_buffer_meta(mut self, send: bool) -> Self {
self.send_buffer_meta = Some(send);
self
}
pub fn session(mut self, session: zenoh::Session) -> Self {
self.session = Some(session);
self
}
pub fn session_group(mut self, group: &str) -> Self {
self.session_group = Some(group.to_string());
self
}
pub fn build(self) -> ZenohSink {
let mut builder = gst::Object::builder::<ZenohSink>().property("key-expr", &self.key_expr);
if let Some(config) = self.config {
builder = builder.property("config", config);
}
if let Some(priority) = self.priority {
builder = builder.property("priority", priority);
}
if let Some(cc) = self.congestion_control {
builder = builder.property("congestion-control", cc);
}
if let Some(rel) = self.reliability {
builder = builder.property("reliability", rel);
}
if let Some(exp) = self.express {
builder = builder.property("express", exp);
}
if let Some(sc) = self.send_caps {
builder = builder.property("send-caps", sc);
}
if let Some(ci) = self.caps_interval {
builder = builder.property("caps-interval", ci);
}
if let Some(sbm) = self.send_buffer_meta {
builder = builder.property("send-buffer-meta", sbm);
}
if let Some(ref sg) = self.session_group {
builder = builder.property("session-group", sg);
}
let sink: ZenohSink = builder.build().unwrap();
if let Some(session) = self.session {
sink.set_session(session);
}
sink
}
}
pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
gst::Element::register(
Some(plugin),
"zenohsink",
gst::Rank::NONE + 100, ZenohSink::static_type(),
)
}