indy-credx 1.1.1

Verifiable credential issuance and presentation for Hyperledger Indy (https://www.hyperledger.org/projects), which provides a distributed-ledger-based foundation for self-sovereign identity (https://sovrin.org).
Documentation
use ffi_support::FfiStr;
use indy_data_types::Qualifiable;

use super::error::{catch_error, ErrorCode};
use super::object::ObjectHandle;
use crate::services::{
    prover::create_credential_request,
    types::{CredentialRequest, CredentialRequestMetadata, DidValue},
};

#[no_mangle]
pub extern "C" fn credx_create_credential_request(
    prover_did: FfiStr,
    cred_def: ObjectHandle,
    link_secret: ObjectHandle,
    link_secret_id: FfiStr,
    cred_offer: ObjectHandle,
    cred_req_p: *mut ObjectHandle,
    cred_req_meta_p: *mut ObjectHandle,
) -> ErrorCode {
    catch_error(|| {
        check_useful_c_ptr!(cred_req_p);
        check_useful_c_ptr!(cred_req_meta_p);
        let prover_did = {
            let did = prover_did
                .as_opt_str()
                .ok_or_else(|| err_msg!("Missing prover DID"))?;
            DidValue::from_str(did)?
        };
        let link_secret_id = link_secret_id
            .as_opt_str()
            .ok_or_else(|| err_msg!("Missing link secret ID"))?;
        let (cred_req, cred_req_metadata) = create_credential_request(
            &prover_did,
            cred_def.load()?.cast_ref()?,
            link_secret.load()?.cast_ref()?,
            link_secret_id,
            cred_offer.load()?.cast_ref()?,
        )?;
        let cred_req = ObjectHandle::create(cred_req)?;
        let cred_req_metadata = ObjectHandle::create(cred_req_metadata)?;
        unsafe {
            *cred_req_p = cred_req;
            *cred_req_meta_p = cred_req_metadata;
        };
        Ok(())
    })
}

impl_indy_object!(CredentialRequest, "CredentialRequest");
impl_indy_object_from_json!(CredentialRequest, credx_credential_request_from_json);

impl_indy_object!(CredentialRequestMetadata, "CredentialRequestMetadata");
impl_indy_object_from_json!(
    CredentialRequestMetadata,
    credx_credential_request_metadata_from_json
);