use crate::ffi::Slice;
use crate::helpers::fields::HeaderField;
#[repr(C)]
#[derive(Clone, Copy)]
pub struct Field {
pub name: Slice,
pub value: Slice,
}
impl Field {
pub unsafe fn parse_all(fields: *const Field, count: usize) -> Option<Vec<HeaderField>> {
if fields.is_null() {
return (count == 0).then(Vec::new);
}
let mut parsed = Vec::with_capacity(count);
for index in 0..count {
let field = unsafe { *fields.add(index) };
let name = unsafe { Slice::borrow_text(field.name.data, field.name.len) }?;
let value = unsafe { Slice::borrow_text(field.value.data, field.value.len) }?;
parsed.push(HeaderField::new(name, value));
}
Some(parsed)
}
}
pub struct Fields(pub Vec<HeaderField>);
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_fields_free(fields: *mut Fields) {
if !fields.is_null() {
drop(unsafe { Box::from_raw(fields) });
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_fields_count(fields: *const Fields) -> usize {
unsafe { fields.as_ref() }.map_or(0, |fields| fields.0.len())
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_fields_name(fields: *const Fields, index: usize) -> Slice {
Slice::maybe(unsafe { fields.as_ref() }.and_then(|fields| fields.0.get(index)).map(|field| field.name.as_str()))
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_fields_value(fields: *const Fields, index: usize) -> Slice {
Slice::maybe(unsafe { fields.as_ref() }.and_then(|fields| fields.0.get(index)).map(|field| field.value.as_str()))
}