Developer SDK

Rust examples

Install the SDK · View source on GitHub ↗

integration/session.rs

use std::{ffi::CString, io, sync::Arc};
use urnetwork_sdk::{Device, Handle, native, take_string};

pub struct Session {
    pub device: Arc<Device>,
    manager: Handle,
    _space: Handle,
    _api: Handle,
}
impl Drop for Session {
    fn drop(&mut self) {
        self.device.close();
        if let Ok(h) = self.manager.value() {
            unsafe {
                (native().unwrap().urnet_network_space_manager_close)(h);
            }
        }
    }
}
impl Session {
    pub fn open() -> Result<Self, Box<dyn std::error::Error>> {
        Self::open_with_connect(true)
    }
    pub fn open_with_connect(connect: bool) -> Result<Self, Box<dyn std::error::Error>> {
        let jwt = CString::new(std::env::var("URNETWORK_CLIENT_JWT")?)?;
        let id = CString::new(std::env::var("URNETWORK_INSTANCE_ID")?)?;
        let raw = native()?;
        unsafe {
            let manager = Handle::from_owned((raw.urnet_new_network_space_manager_no_storage)())?;
            let space = Handle::from_owned((raw
                .urnet_network_space_manager_update_network_space_values)(
                manager.value()?,
                c"{\"host_name\":\"ur.network\",\"env_name\":\"main\"}".as_ptr(),
                c"{\"migration_host_name\":\"bringyour.com\"}".as_ptr(),
            ))?;
            let api = Handle::from_owned((raw.urnet_network_space_get_api)(space.value()?))?;
            (raw.urnet_api_set_by_jwt)(api.value()?, jwt.as_ptr());
            let mut error = std::ptr::null_mut();
            let handle = (raw.urnet_new_device_local_with_defaults)(
                space.value()?,
                jwt.as_ptr(),
                c"Rust example".as_ptr(),
                c"rust".as_ptr(),
                c"1".as_ptr(),
                id.as_ptr(),
                false,
                &mut error,
            );
            if let Some(message) = take_string(error) {
                (raw.urnet_network_space_manager_close)(manager.value()?);
                return Err(io::Error::other(message).into());
            }
            let device = Arc::new(Device::from_owned(handle)?);
            if connect {
                (raw.urnet_device_set_connect_location)(
                    handle,
                    c"{\"connect_location_id\":{\"best_available\":true}}".as_ptr(),
                );
            }
            Ok(Self {
                device,
                manager,
                _space: space,
                _api: api,
            })
        }
    }
}