use super::{retained::FieldBindings, AnalyzerBindings};
use crate::{read_control::StorageReadControl, StorageBackendResult};
use std::{collections::BTreeMap, sync::Arc};
pub struct RetainedAnalyzerBindings(AnalyzerBindings);
impl RetainedAnalyzerBindings {
pub fn capture(
source: &AnalyzerBindings,
control: &StorageReadControl,
) -> StorageBackendResult<Self> {
source.retained(control).map(Self)
}
}
impl Clone for RetainedAnalyzerBindings {
fn clone(&self) -> Self {
let fields = match &self.0.fields {
FieldBindings::Retained(fields) => FieldBindings::Retained(Arc::clone(fields)),
FieldBindings::Live(fields) => {
assert!(fields.is_empty(), "captured bindings own frozen fields");
FieldBindings::Live(BTreeMap::new())
}
};
Self(AnalyzerBindings {
default: Arc::clone(&self.0.default),
fields,
})
}
}
impl std::ops::Deref for RetainedAnalyzerBindings {
type Target = AnalyzerBindings;
fn deref(&self) -> &Self::Target {
&self.0
}
}