iroha icon indicating copy to clipboard operation
iroha copied to clipboard

generic structs parametrized with concrete types in FFI

Open mversic opened this issue 2 years ago • 0 comments

If we take a look at crypto/src/signature.rs we can see the SignatureOf<T> which is used in our data_model API (namely in transactions API). For instance, ValidTransaction is defined as:

pub struct ValidTransaction {
    /// The [`Transaction`]'s payload.
    pub payload: Payload,
    /// [`SignatureOf`] [`Payload`].
    pub signatures: SignaturesOf<Payload>,
}

and would have to be turned into:

#[derive(Getters, IntoFfi, TryFromReprC)]
#[getset(get = "pub")]
#[cfg_attr(
    all(feature = "ffi_export", not(feature = "ffi_import")),
    iroha_ffi::ffi_export
)]
#[cfg_attr(feature = "ffi_import", iroha_ffi::ffi_import)]
pub struct ValidTransaction {
    /// The [`Transaction`]'s payload.
    payload: Payload,
    /// [`SignatureOf`] [`Payload`].
    signatures: SignaturesOf<Payload>,
}

which, once the macro is expanded, will generate ffi function with a signature equivalent to the following:

pub extern "C" fn ValidTransaction__signatures(*const ValidTransaction, output: *mut *const SignaturesOf<Payload>) -> FfiReturn {
    /// fn body
}

because unlike SignaturesOf<T>, SignaturesOf<Payload> is allowed in extern functions

While the code for generating the previous FFI function is mostly in place already, it remains to be investigated how to implement IntoFfi and TryFromReprC derive macros on SignaturesOf<T> and alike. The fact that SignaturesOf<T> is turned into an opaque pointer might make it possible to derive both of the traits for generic SignaturesOf<T>

mversic avatar Aug 11 '22 19:08 mversic