Skip to main content

motorcortex_rust/blocking/
subscribe.rs

1//! Blocking wrapper around [`crate::core::Subscribe`].
2
3use std::sync::Arc;
4
5use tokio::runtime::Runtime;
6
7use crate::client::Parameters;
8use crate::connection::ConnectionOptions;
9use crate::core;
10use crate::error::{MotorcortexError, Result};
11
12use super::Subscription;
13use super::request::Request;
14
15pub struct Subscribe {
16    inner: core::Subscribe,
17    pub(crate) rt: Arc<Runtime>,
18}
19
20impl Subscribe {
21    pub fn new() -> Result<Self> {
22        let rt = tokio::runtime::Builder::new_current_thread()
23            .enable_all()
24            .build()
25            .map_err(|e| MotorcortexError::Connection(e.to_string()))?;
26        Ok(Self {
27            inner: core::Subscribe::new(),
28            rt: Arc::new(rt),
29        })
30    }
31
32    pub fn connect_to(url: &str, opts: ConnectionOptions) -> Result<Self> {
33        let sub = Self::new()?;
34        sub.connect(url, opts)?;
35        Ok(sub)
36    }
37
38    pub fn connect(&self, url: &str, opts: ConnectionOptions) -> Result<()> {
39        self.rt.block_on(self.inner.connect(url, opts))
40    }
41
42    pub fn disconnect(&self) -> Result<()> {
43        self.rt.block_on(self.inner.disconnect())
44    }
45
46    pub fn subscribe<I>(
47        &self,
48        req: &Request,
49        paths: I,
50        alias: &str,
51        fdiv: u32,
52    ) -> Result<Subscription>
53    where
54        I: Parameters,
55    {
56        let core_sub = self
57            .rt
58            .block_on(self.inner.subscribe(req.as_async(), paths, alias, fdiv))?;
59        Ok(Subscription::new(core_sub, Arc::clone(&self.rt)))
60    }
61
62    pub fn unsubscribe(&self, req: &Request, sub: Subscription) -> Result<()> {
63        self.rt
64            .block_on(self.inner.unsubscribe(req.as_async(), sub.into_inner()))
65    }
66
67    pub fn as_async(&self) -> &core::Subscribe {
68        &self.inner
69    }
70}