use crate::uplink_c::Ensurer;
use crate::{Error, Result};
use std::ffi::CStr;
use uplink_sys as ulksys;
#[derive(Debug, Clone)]
pub struct Gateway {
pub access_key_id: String,
pub secret_key: String,
pub endpoint: String,
}
impl Gateway {
pub(crate) fn from_ffi_credentials_result(
uc_result: ulksys::EdgeCredentialsResult,
) -> Result<Self> {
uc_result.ensure();
if let Some(err) = Error::new_uplink(uc_result.error) {
unsafe { ulksys::edge_free_credentials_result(uc_result) };
return Err(err);
}
let access_key_id: String;
let secret_key: String;
let endpoint: String;
unsafe {
let creds = *uc_result.credentials;
creds.ensure();
access_key_id = CStr::from_ptr(creds.access_key_id)
.to_str()
.map_err(|err| {
ulksys::edge_free_credentials_result(uc_result);
Error::new_internal(
"FFI returned an invalid access key ID; it contains invalid UTF-8 characters",
err.into(),
)
})?
.to_string();
secret_key = CStr::from_ptr(creds.secret_key)
.to_str()
.map_err(|err| {
ulksys::edge_free_credentials_result(uc_result);
Error::new_internal(
"FFI returned an invalid secret key; it contains invalid UTF-8 characters",
err.into(),
)
})?
.to_string();
endpoint = CStr::from_ptr(creds.endpoint)
.to_str()
.map_err(|err| {
ulksys::edge_free_credentials_result(uc_result);
Error::new_internal(
"FFI returned an invalid endpoint; it contains invalid UTF-8 characters",
err.into(),
)
})?
.to_string();
ulksys::edge_free_credentials_result(uc_result);
}
Ok(Self {
access_key_id,
secret_key,
endpoint,
})
}
}