extern crate time;
use sovrin::api::ErrorCode;
use sovrin::api::ledger::{
sovrin_sign_and_submit_request,
sovrin_submit_request,
sovrin_build_get_ddo_request,
sovrin_build_attrib_request,
sovrin_build_get_attrib_request,
sovrin_build_get_nym_request,
sovrin_build_schema_request,
sovrin_build_get_schema_request,
sovrin_build_claim_def_txn,
sovrin_build_get_claim_def_txn,
sovrin_build_node_request,
sovrin_build_nym_request
};
use utils::callback::CallbackUtils;
use utils::timeout::TimeoutUtils;
use std::ffi::CString;
use std::ptr::null;
use std::sync::mpsc::channel;
pub struct LedgerUtils {}
impl LedgerUtils {
pub fn sign_and_submit_request(pool_handle: i32, wallet_handle: i32, submitter_did: &str, request_json: &str) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_result_json| {
sender.send((err, request_result_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_sign_and_submit_request_cb(cb);
let submitter_did = CString::new(submitter_did).unwrap();
let request_json = CString::new(request_json).unwrap();
let err =
sovrin_sign_and_submit_request(command_handle,
pool_handle,
wallet_handle,
submitter_did.as_ptr(),
request_json.as_ptr(),
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_result_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_result_json)
}
pub fn submit_request(pool_handle: i32, request_json: &str) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_result_json| {
sender.send((err, request_result_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_submit_request_cb(cb);
let request_json = CString::new(request_json).unwrap();
let err =
sovrin_submit_request(command_handle,
pool_handle,
request_json.as_ptr(),
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_result_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_result_json)
}
pub fn build_get_ddo_request(submitter_did: &str, target_did: &str) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_json| {
sender.send((err, request_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_build_request_cb(cb);
let submitter_did = CString::new(submitter_did).unwrap();
let target_did = CString::new(target_did).unwrap();
let err =
sovrin_build_get_ddo_request(command_handle,
submitter_did.as_ptr(),
target_did.as_ptr(),
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_json)
}
pub fn build_nym_request(submitter_did: &str, target_did: &str, verkey: Option<&str>,
data: Option<&str>, role: Option<&str>) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_json| {
sender.send((err, request_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_build_request_cb(cb);
let submitter_did = CString::new(submitter_did).unwrap();
let target_did = CString::new(target_did).unwrap();
let verkey_str = verkey.map(|s| CString::new(s).unwrap()).unwrap_or(CString::new("").unwrap());;
let data_str = data.map(|s| CString::new(s).unwrap()).unwrap_or(CString::new("").unwrap());;
let role_str = role.map(|s| CString::new(s).unwrap()).unwrap_or(CString::new("").unwrap());;
let err =
sovrin_build_nym_request(command_handle,
submitter_did.as_ptr(),
target_did.as_ptr(),
if verkey.is_some() { verkey_str.as_ptr() } else { null() },
if data.is_some() { data_str.as_ptr() } else { null() },
if role.is_some() { role_str.as_ptr() } else { null() },
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_json)
}
pub fn build_attrib_request(submitter_did: &str, target_did: &str, hash: Option<&str>, raw: Option<&str>, enc: Option<&str>) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_json| {
sender.send((err, request_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_build_request_cb(cb);
let submitter_did = CString::new(submitter_did).unwrap();
let target_did = CString::new(target_did).unwrap();
let hash_str = hash.map(|s| CString::new(s).unwrap()).unwrap_or(CString::new("").unwrap());
let raw_str = raw.map(|s| CString::new(s).unwrap()).unwrap_or(CString::new("").unwrap());
let enc_str = enc.map(|s| CString::new(s).unwrap()).unwrap_or(CString::new("").unwrap());
let err =
sovrin_build_attrib_request(command_handle,
submitter_did.as_ptr(),
target_did.as_ptr(),
if hash.is_some() { hash_str.as_ptr() } else { null() },
if raw.is_some() { raw_str.as_ptr() } else { null() },
if enc.is_some() { enc_str.as_ptr() } else { null() },
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_json)
}
pub fn build_get_attrib_request(submitter_did: &str, target_did: &str, data: &str) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_json| {
sender.send((err, request_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_build_request_cb(cb);
let submitter_did = CString::new(submitter_did).unwrap();
let target_did = CString::new(target_did).unwrap();
let data = CString::new(data).unwrap();
let err =
sovrin_build_get_attrib_request(command_handle,
submitter_did.as_ptr(),
target_did.as_ptr(),
data.as_ptr(),
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_json)
}
pub fn build_get_nym_request(submitter_did: &str, target_did: &str) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_json| {
sender.send((err, request_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_build_request_cb(cb);
let submitter_did = CString::new(submitter_did).unwrap();
let target_did = CString::new(target_did).unwrap();
let err =
sovrin_build_get_nym_request(command_handle,
submitter_did.as_ptr(),
target_did.as_ptr(),
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_json)
}
pub fn build_schema_request(submitter_did: &str, data: &str) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_json| {
sender.send((err, request_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_build_request_cb(cb);
let submitter_did = CString::new(submitter_did).unwrap();
let data = CString::new(data).unwrap();
let err =
sovrin_build_schema_request(command_handle,
submitter_did.as_ptr(),
data.as_ptr(),
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_json)
}
pub fn build_get_schema_request(submitter_did: &str, dest: &str, data: &str) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_json| {
sender.send((err, request_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_build_request_cb(cb);
let submitter_did = CString::new(submitter_did).unwrap();
let dest = CString::new(dest).unwrap();
let data = CString::new(data).unwrap();
let err =
sovrin_build_get_schema_request(command_handle,
submitter_did.as_ptr(),
dest.as_ptr(),
data.as_ptr(),
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_json)
}
pub fn build_claim_def_txn(submitter_did: &str, xref: i32, signature_type: &str, data: &str) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_json| {
sender.send((err, request_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_build_request_cb(cb);
let submitter_did = CString::new(submitter_did).unwrap();
let signature_type = CString::new(signature_type).unwrap();
let data = CString::new(data).unwrap();
let err =
sovrin_build_claim_def_txn(command_handle,
submitter_did.as_ptr(),
xref,
signature_type.as_ptr(),
data.as_ptr(),
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_json)
}
pub fn build_get_claim_def_txn(submitter_did: &str, xref: i32, signature_type: &str, origin: &str) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_json| {
sender.send((err, request_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_build_request_cb(cb);
let submitter_did = CString::new(submitter_did).unwrap();
let signature_type = CString::new(signature_type).unwrap();
let origin = CString::new(origin).unwrap();
let err =
sovrin_build_get_claim_def_txn(command_handle,
submitter_did.as_ptr(),
xref,
signature_type.as_ptr(),
origin.as_ptr(),
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_json)
}
pub fn build_node_request(submitter_did: &str, target_did: &str, data: &str) -> Result<String, ErrorCode> {
let (sender, receiver) = channel();
let cb = Box::new(move |err, request_json| {
sender.send((err, request_json)).unwrap();
});
let (command_handle, cb) = CallbackUtils::closure_to_build_request_cb(cb);
let submitter_did = CString::new(submitter_did).unwrap();
let target_did = CString::new(target_did).unwrap();
let data = CString::new(data).unwrap();
let err =
sovrin_build_node_request(command_handle,
submitter_did.as_ptr(),
target_did.as_ptr(),
data.as_ptr(),
cb);
if err != ErrorCode::Success {
return Err(err);
}
let (err, request_json) = receiver.recv_timeout(TimeoutUtils::long_timeout()).unwrap();
if err != ErrorCode::Success {
return Err(err);
}
Ok(request_json)
}
}