iroha
iroha copied to clipboard
generic structs parametrized with concrete types in FFI
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>