Skip to main content

parse_url

Function parse_url 

Source
pub fn parse_url(s: &str) -> Result<(String, String)>
Expand description

Split a Motorcortex URL into (req_url, sub_url).

Two input forms are accepted:

  • scheme://host:req_port:sub_port → each port attached to its own copy of the host.
  • scheme://host/mcx_req / /mcx_sub appended, matching the nginx reverse-proxy convention used by motorcortex-python.

Examples:

use motorcortex_rust::parse_url;
let (req, sub) = parse_url("wss://host:5568:5567").unwrap();
assert_eq!(req, "wss://host:5568");
assert_eq!(sub, "wss://host:5567");

let (req, sub) = parse_url("wss://host").unwrap();
assert_eq!(req, "wss://host/mcx_req");
assert_eq!(sub, "wss://host/mcx_sub");

Errors with MotorcortexError::Connection if the scheme is missing, an IPv6 bracket is unclosed, only one port is given, or either port isn’t parseable as a u16.

Examples found in repository?
examples/blocking_request.rs (line 25)
15fn main() -> Result<()> {
16    let mut args = env::args().skip(1);
17    let url = args.next().unwrap_or_else(|| "wss://127.0.0.1:5568:5567".into());
18    let cert = args.next().unwrap_or_else(|| "tests/mcx.cert.crt".into());
19    let user = args.next().unwrap_or_else(|| "root".into());
20    let pass = args.next().unwrap_or_default();
21    let path = args
22        .next()
23        .unwrap_or_else(|| "root/Control/dummyDouble".into());
24
25    let (req_url, _sub_url) = parse_url(&url)?;
26    let opts = ConnectionOptions::new(cert, 5_000, 5_000);
27    let req = Request::connect_to(&req_url, opts)?;
28    req.login(&user, &pass)?;
29    req.request_parameter_tree()?;
30
31    let value: f64 = req.get_parameter(&path)?;
32    println!("{path} = {value}");
33
34    req.disconnect()?;
35    Ok(())
36}
More examples
Hide additional examples
examples/async_request.rs (line 25)
15async fn main() -> Result<()> {
16    let mut args = env::args().skip(1);
17    let url = args.next().unwrap_or_else(|| "wss://127.0.0.1:5568:5567".into());
18    let cert = args.next().unwrap_or_else(|| "tests/mcx.cert.crt".into());
19    let user = args.next().unwrap_or_else(|| "root".into());
20    let pass = args.next().unwrap_or_default();
21    let path = args
22        .next()
23        .unwrap_or_else(|| "root/Control/dummyDouble".into());
24
25    let (req_url, _sub_url) = parse_url(&url)?;
26    let opts = ConnectionOptions::new(cert, 5_000, 5_000);
27    let req = Request::connect_to(&req_url, opts).await?;
28    req.login(&user, &pass).await?;
29    req.request_parameter_tree().await?;
30
31    let value: f64 = req.get_parameter(&path).await?;
32    println!("{path} = {value}");
33
34    req.disconnect().await?;
35    Ok(())
36}
examples/subscribe_latest.rs (line 29)
19async fn main() -> Result<()> {
20    let mut args = env::args().skip(1);
21    let url = args.next().unwrap_or_else(|| "wss://127.0.0.1:5568:5567".into());
22    let cert = args.next().unwrap_or_else(|| "tests/mcx.cert.crt".into());
23    let user = args.next().unwrap_or_else(|| "root".into());
24    let pass = args.next().unwrap_or_default();
25    let path = args
26        .next()
27        .unwrap_or_else(|| "root/Control/dummyDouble".into());
28
29    let (req_url, sub_url) = parse_url(&url)?;
30    let opts = ConnectionOptions::new(cert, 5_000, 5_000);
31    let req = Request::connect_to(&req_url, opts.clone()).await?;
32    req.login(&user, &pass).await?;
33    req.request_parameter_tree().await?;
34    let sub = Subscribe::connect_to(&sub_url, opts).await?;
35    let subscription = sub.subscribe(&req, [&path[..]], "example-latest", 100).await?;
36
37    // Sample the latest value every second for 5 seconds.
38    for _ in 0..5 {
39        let (_ts, value): (_, f64) = subscription.latest().await?;
40        println!("{path} = {value}");
41        tokio::time::sleep(Duration::from_secs(1)).await;
42    }
43
44    sub.unsubscribe(&req, subscription).await?;
45    sub.disconnect().await?;
46    req.disconnect().await?;
47    Ok(())
48}
examples/subscribe_stream.rs (line 28)
18async fn main() -> Result<()> {
19    let mut args = env::args().skip(1);
20    let url = args.next().unwrap_or_else(|| "wss://127.0.0.1:5568:5567".into());
21    let cert = args.next().unwrap_or_else(|| "tests/mcx.cert.crt".into());
22    let user = args.next().unwrap_or_else(|| "root".into());
23    let pass = args.next().unwrap_or_default();
24    let path = args
25        .next()
26        .unwrap_or_else(|| "root/Control/dummyDouble".into());
27
28    let (req_url, sub_url) = parse_url(&url)?;
29    let opts = ConnectionOptions::new(cert, 5_000, 5_000);
30    let req = Request::connect_to(&req_url, opts.clone()).await?;
31    req.login(&user, &pass).await?;
32    req.request_parameter_tree().await?;
33    let sub = Subscribe::connect_to(&sub_url, opts).await?;
34    let subscription = sub.subscribe(&req, [&path[..]], "example-stream", 10).await?;
35
36    // Read 20 samples from the ring. Ring size 256 means we tolerate
37    // a ~256-sample consumer stall before seeing Missed.
38    let mut stream = Box::pin(subscription.stream::<f64>(256));
39    let deadline = tokio::time::Instant::now() + Duration::from_secs(5);
40    let mut seen = 0;
41    while seen < 20 {
42        match tokio::time::timeout_at(deadline, stream.next()).await {
43            Ok(Some(Ok((_ts, v)))) => {
44                println!("{path} = {v}");
45                seen += 1;
46            }
47            Ok(Some(Err(Missed(n)))) => eprintln!("lagged, dropped {n} samples"),
48            Ok(None) | Err(_) => break,
49        }
50    }
51
52    sub.unsubscribe(&req, subscription).await?;
53    sub.disconnect().await?;
54    req.disconnect().await?;
55    Ok(())
56}