diff --git a/rust/logos-blockchain-circuits-types/src/ffi/witness_input.rs b/rust/logos-blockchain-circuits-types/src/ffi/witness_input.rs index d22bd18..431f959 100644 --- a/rust/logos-blockchain-circuits-types/src/ffi/witness_input.rs +++ b/rust/logos-blockchain-circuits-types/src/ffi/witness_input.rs @@ -1,6 +1,7 @@ use std::ffi::c_char; use crate::ffi::ConstBytes; +#[repr(C)] pub struct WitnessInput { pub dat: ConstBytes, pub inputs_json: *const c_char, diff --git a/rust/logos-blockchain-circuits-types/src/native/bytes.rs b/rust/logos-blockchain-circuits-types/src/native/bytes.rs index 0ce8d1c..f905a0b 100644 --- a/rust/logos-blockchain-circuits-types/src/native/bytes.rs +++ b/rust/logos-blockchain-circuits-types/src/native/bytes.rs @@ -4,11 +4,22 @@ pub struct Bytes(Vec); impl Bytes { #[must_use] - pub fn inner(&self) -> &Vec { + pub fn into_inner(self) -> Vec { + self.0 + } + + #[must_use] + pub fn as_slice(&self) -> &[u8] { &self.0 } } +impl From> for Bytes { + fn from(value: Vec) -> Self { + Self(value) + } +} + impl From for Bytes { fn from(mut ffi_value: ffi::Bytes) -> Self { let raw = unsafe { diff --git a/rust/logos-blockchain-circuits-types/src/native/witness_input.rs b/rust/logos-blockchain-circuits-types/src/native/witness_input.rs index cce8ea0..562328a 100644 --- a/rust/logos-blockchain-circuits-types/src/native/witness_input.rs +++ b/rust/logos-blockchain-circuits-types/src/native/witness_input.rs @@ -1,4 +1,4 @@ -use std::ffi::{c_char, CString}; +use std::ffi::{c_char, CString, NulError}; use crate::ffi; pub struct WitnessInput { @@ -12,8 +12,7 @@ impl WitnessInput { Self { dat, inputs_json } } - #[must_use] - pub fn as_ffi(&'_ self) -> WitnessInputFfiGuard<'_> { + pub fn as_ffi(&'_ self) -> Result, NulError> { WitnessInputFfiGuard::new(self) } } @@ -28,15 +27,14 @@ pub struct WitnessInputFfiGuard<'a> { } impl<'a> WitnessInputFfiGuard<'a> { - #[must_use] - fn new(inner: &'a WitnessInput) -> Self { + fn new(inner: &'a WitnessInput) -> Result { let dat = ffi::ConstBytes { data: inner.dat.as_ptr(), size: inner.dat.len() }; - let inputs_json = CString::new(inner.inputs_json.clone()).expect("CString::new failed").into_raw(); + let inputs_json = CString::new(inner.inputs_json.clone())?.into_raw(); let ffi = ffi::WitnessInput { dat, inputs_json }; - Self { + Ok(Self { ffi, _lifetime: std::marker::PhantomData, - } + }) } } @@ -55,4 +53,3 @@ impl<'a> Drop for WitnessInputFfiGuard<'a> { } } } -