use crate::uplink_c::{string_from_ffi_string_result, Ensurer};
use crate::{helpers, Result};
use std::ffi::CString;
use std::ptr;
use uplink_sys as ulksys;
pub fn share_url(
base_url: &str,
access_key_id: &str,
bucket: &str,
key: &str,
opts: Option<&OptionsShareURL>,
) -> Result<String> {
let base_url = helpers::cstring_from_str_fn_arg("base_url", base_url)?;
let access_key = helpers::cstring_from_str_fn_arg("access_key_id", access_key_id)?;
let bucket = helpers::cstring_from_str_fn_arg("bucket", bucket)?;
let key = helpers::cstring_from_str_fn_arg("key", key)?;
let res: ulksys::UplinkStringResult;
unsafe {
let c_base_url = base_url.into_raw();
let c_access_key = access_key.into_raw();
let c_bucket = bucket.into_raw();
let c_key = key.into_raw();
if let Some(o) = opts {
let edge_opts = o.as_ffi_options_share_url();
let c_opts = &edge_opts as *const ulksys::EdgeShareURLOptions;
res = ulksys::edge_join_share_url(
c_base_url,
c_access_key,
c_bucket,
c_key,
c_opts as *mut ulksys::EdgeShareURLOptions,
);
} else {
res = ulksys::edge_join_share_url(
c_base_url,
c_access_key,
c_bucket,
c_key,
ptr::null_mut(),
);
}
let _ = CString::from_raw(c_base_url);
let _ = CString::from_raw(c_access_key);
let _ = CString::from_raw(c_bucket);
let _ = CString::from_raw(c_key);
}
res.ensure();
string_from_ffi_string_result(res)
}
pub struct OptionsShareURL {
pub raw: bool,
}
impl OptionsShareURL {
pub(crate) fn as_ffi_options_share_url(&self) -> ulksys::EdgeShareURLOptions {
ulksys::EdgeShareURLOptions { raw: self.raw }
}
}