1use crate::ffi::{
2 director, req, sess, vrt_ctx, ws, DIRECTOR_MAGIC, REQ_MAGIC, SESS_MAGIC, VCL_BACKEND,
3 VRT_CTX_MAGIC, WS_MAGIC,
4};
5
6pub unsafe fn validate_vrt_ctx(ctxp: *const vrt_ctx) -> &'static vrt_ctx {
7 let val = ctxp.as_ref().unwrap();
8 assert_eq!(val.magic, VRT_CTX_MAGIC);
9 val
10}
11
12pub unsafe fn validate_director(be: VCL_BACKEND) -> &'static director {
13 let val = be.0.as_ref().unwrap();
14 assert_eq!(val.magic, DIRECTOR_MAGIC);
15 val
16}
17
18pub unsafe fn validate_ws(wsp: *mut ws) -> &'static mut ws {
19 let val = wsp.as_mut().unwrap();
20 assert_eq!(val.magic, WS_MAGIC);
21 val
22}
23
24impl vrt_ctx {
25 pub fn validated_req(&mut self) -> &mut req {
26 let val = unsafe { self.req.as_mut().unwrap() };
27 assert_eq!(val.magic, REQ_MAGIC);
28 val
29 }
30}
31
32impl req {
33 pub fn validated_session(&mut self) -> &sess {
34 let val = unsafe { self.sp.as_ref().unwrap() };
35 assert_eq!(val.magic, SESS_MAGIC);
36 val
37 }
38}
39
40#[cfg(not(varnishsys_6))]
41pub use version_after_v6::*;
42
43#[cfg(not(varnishsys_6))]
44mod version_after_v6 {
45 use crate::ffi::{
46 self, director, vcldir, vfp_ctx, vfp_entry, vrt_ctx, VCLDIR_MAGIC, VFP_CTX_MAGIC,
47 VFP_ENTRY_MAGIC,
48 };
49 use crate::vcl::{DeliveryFilters, FetchFilters};
50
51 pub unsafe fn validate_vfp_ctx(ctxp: *mut vfp_ctx) -> &'static mut vfp_ctx {
52 let val = ctxp.as_mut().unwrap();
53 assert_eq!(val.magic, VFP_CTX_MAGIC);
54 val
55 }
56
57 pub unsafe fn validate_vfp_entry(vfep: *mut vfp_entry) -> &'static mut vfp_entry {
58 let val = vfep.as_mut().unwrap();
59 assert_eq!(val.magic, VFP_ENTRY_MAGIC);
60 val
61 }
62
63 pub unsafe fn validate_vdir(be: &director) -> &'static mut vcldir {
64 let val = be.vdir.as_mut().unwrap();
65 assert_eq!(val.magic, VCLDIR_MAGIC);
66 val
67 }
68
69 impl vrt_ctx {
70 #[expect(clippy::vec_box)] pub fn fetch_filters<'c, 'f>(
72 &'c self,
73 filters: &'f mut Vec<Box<ffi::vfp>>,
74 ) -> FetchFilters<'c, 'f> {
75 FetchFilters::<'c, 'f>::new(self, filters)
76 }
77
78 #[expect(clippy::vec_box)] pub fn delivery_filters<'c, 'f>(
80 &'c self,
81 filters: &'f mut Vec<Box<ffi::vdp>>,
82 ) -> DeliveryFilters<'c, 'f> {
83 DeliveryFilters::<'c, 'f>::new(self, filters)
84 }
85 }
86}