motorcortex_rust/blocking/
subscribe.rs1use 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}