Simplify guard.

This commit is contained in:
Alejandro Cabeza Romero 2026-04-24 13:47:43 +02:00
parent 73c3ca7cb5
commit 220707d9ee
No known key found for this signature in database
GPG Key ID: DA3D14AE478030FD

View File

@ -1,4 +1,4 @@
use std::ffi::{c_char, CString, NulError};
use std::ffi::{CString, NulError};
use crate::ffi;
/// Input for witness generators
@ -6,41 +6,36 @@ pub struct WitnessInput {
/// The circuit's dat file contents.
dat: Vec<u8>,
/// The JSON string containing the circuit inputs.
inputs_json: String,
inputs_json: CString,
}
impl WitnessInput {
#[must_use]
pub const fn new(dat: Vec<u8>, inputs_json: String) -> Self {
Self { dat, inputs_json }
pub fn new(dat: Vec<u8>, inputs_json: String) -> Result<Self, NulError> {
let inputs_json = CString::new(inputs_json)?;
Ok(Self { dat, inputs_json })
}
/// Borrows this value as a temporary FFI-compatible view.
///
/// Returns an error if `inputs_json` contains an interior null byte.
pub fn as_ffi(&'_ self) -> Result<WitnessInputFfiGuard<'_>, NulError> {
pub fn as_ffi(&'_ self) -> WitnessInputFfiGuard<'_> {
WitnessInputFfiGuard::new(self)
}
}
/// Temporary FFI view of a [`WitnessInput`], valid for the lifetime of the source.
///
/// Owns the C string allocation of `WitnessInput::inputs_json` and ensures it is freed when
/// dropped.
/// Temporary FFI view of a [`WitnessInput`], which makes [`ffi::WitnessInput`] lifetime-aware.
pub struct WitnessInputFfiGuard<'a> {
ffi: ffi::WitnessInput,
_lifetime: std::marker::PhantomData<&'a WitnessInput>,
}
impl<'a> WitnessInputFfiGuard<'a> {
fn new(inner: &'a WitnessInput) -> Result<Self, NulError> {
fn new(inner: &'a WitnessInput) -> Self {
let dat = ffi::ConstBytes { data: inner.dat.as_ptr(), size: inner.dat.len() };
let inputs_json = CString::new(inner.inputs_json.clone())?.into_raw(); // TODO CLEANER?
let inputs_json = inner.inputs_json.as_ptr();
let ffi = ffi::WitnessInput { dat, inputs_json };
Ok(Self {
Self {
ffi,
_lifetime: std::marker::PhantomData,
})
}
}
}
@ -49,13 +44,3 @@ impl<'a> AsRef<ffi::WitnessInput> for WitnessInputFfiGuard<'a> {
&self.ffi
}
}
impl<'a> Drop for WitnessInputFfiGuard<'a> {
fn drop(&mut self) {
if !self.ffi.inputs_json.is_null() {
drop(unsafe {
CString::from_raw(self.ffi.inputs_json as *mut c_char)
})
}
}
}