viceroy_lib/wiggle_abi/
fastly_purge_impl.rs

1//! fastly_purge` hostcall implementations.
2
3use {
4    super::types::{PurgeOptions, PurgeOptionsMask},
5    crate::{error::Error, session::Session, wiggle_abi::fastly_purge::FastlyPurge},
6    wiggle::{GuestMemory, GuestPtr},
7};
8
9impl FastlyPurge for Session {
10    fn purge_surrogate_key(
11        &mut self,
12        memory: &mut GuestMemory<'_>,
13        surrogate_key: GuestPtr<str>,
14        mut options_mask: PurgeOptionsMask,
15        _options: GuestPtr<PurgeOptions>,
16    ) -> Result<(), Error> {
17        let soft_purge = options_mask.contains(PurgeOptionsMask::SOFT_PURGE);
18        options_mask &= !PurgeOptionsMask::SOFT_PURGE;
19
20        if options_mask != PurgeOptionsMask::empty() {
21            return Err(Error::Unsupported {
22                msg: "unsupported purge option",
23            });
24        }
25
26        let key = memory
27            .as_str(surrogate_key)?
28            .ok_or(Error::SharedMemory)?
29            .parse()?;
30        let purged = self.cache().purge(key, soft_purge);
31        tracing::debug!("{purged} variants purged");
32        Ok(())
33    }
34}