use { crate::{ client::Client, criteria::{ clm::{ClmRootMatcherMap, RootMatchers}, crit_matchers::critm_string::{CritMatchString, StringAccess}, }, security_context_acceptor::AcceptorMetadata, }, std::{marker::PhantomData, rc::Rc}, }; pub type ClmMatchString = CritMatchString, T>; pub type ClmMatchSandboxEngine = ClmMatchString>; pub type ClmMatchSandboxAppId = ClmMatchString>; pub type ClmMatchSandboxInstanceId = ClmMatchString>; pub struct AcceptorMetadataAccess(PhantomData); trait SandboxField: Sized + 'static { fn field(meta: &AcceptorMetadata) -> &Option; fn nodes( roots: &RootMatchers, ) -> &ClmRootMatcherMap>>; } pub struct SandboxEngineField; pub struct SandboxAppIdField; pub struct SandboxInstanceIdField; impl StringAccess> for AcceptorMetadataAccess where T: SandboxField, { fn with_string(data: &Rc, f: impl FnOnce(&str) -> bool) -> bool { f(T::field(&data.acceptor).as_deref().unwrap_or_default()) } fn nodes(roots: &RootMatchers) -> &ClmRootMatcherMap> { T::nodes(roots) } } impl SandboxField for SandboxEngineField { fn field(meta: &AcceptorMetadata) -> &Option { &meta.sandbox_engine } fn nodes( roots: &RootMatchers, ) -> &ClmRootMatcherMap>> { &roots.sandbox_engine } } impl SandboxField for SandboxAppIdField { fn field(meta: &AcceptorMetadata) -> &Option { &meta.app_id } fn nodes( roots: &RootMatchers, ) -> &ClmRootMatcherMap>> { &roots.sandbox_app_id } } impl SandboxField for SandboxInstanceIdField { fn field(meta: &AcceptorMetadata) -> &Option { &meta.instance_id } fn nodes( roots: &RootMatchers, ) -> &ClmRootMatcherMap>> { &roots.sandbox_instance_id } }