varnish_sys/vcl/
vsb.rs

1use std::ffi::c_void;
2
3use crate::ffi;
4
5/// A wrapper for scalable/growable buffer (VSB) managed by Varnish
6#[derive(Debug)]
7pub struct Buffer<'a> {
8    /// Raw pointer to the C struct
9    pub raw: &'a mut ffi::vsb,
10}
11
12impl Buffer<'_> {
13    /// Create a `Vsb` from a C pointer
14    #[expect(clippy::not_unsafe_ptr_arg_deref)]
15    pub fn from_ptr(raw: *mut ffi::vsb) -> Self {
16        let raw = unsafe { raw.as_mut().unwrap() };
17        assert_eq!(raw.magic, ffi::VSB_MAGIC);
18        Self { raw }
19    }
20
21    /// Push a buffer into the buffer
22    #[expect(clippy::result_unit_err)] // FIXME: what should the error be? VclError?
23    pub fn write<T: AsRef<[u8]>>(&mut self, src: &T) -> Result<(), ()> {
24        let buf = src.as_ref().as_ptr().cast::<c_void>();
25        let l = src.as_ref().len();
26
27        match unsafe { ffi::VSB_bcat(self.raw, buf, l as isize) } {
28            0 => Ok(()),
29            _ => Err(()),
30        }
31    }
32}