use vantage_dataset::traits::ReadableValueSet;
use super::Probe;
use super::narrowing::narrow_into;
use super::window::leading_into;
use crate::{Capability, Vista};
pub async fn check_advertised(vista: &Vista) {
let mut probe = Probe::default();
for capability in vista.capabilities().iter() {
match capability {
Capability::Window => probe.check_ok(
capability,
"fetch_window(1, 1)",
&vista.fetch_window(1, 1).await,
),
Capability::Cursor => probe.check_ok(
capability,
"fetch_cursor",
&vista.fetch_cursor(None, 1).await,
),
Capability::Subscribe => {
probe.check_ok(capability, "watch", &vista.watch().await.map(drop))
}
Capability::Traverse => probe_traverse(vista, &mut probe).await,
Capability::Search
| Capability::Order
| Capability::FilterOps
| Capability::NativeConditions
| Capability::Insert
| Capability::Update
| Capability::Delete
| Capability::Import
| Capability::ConfineWrites => {}
}
}
leading_into(vista, &mut probe).await;
narrow_into(vista, &mut probe).await;
probe.finish();
}
async fn probe_traverse(vista: &Vista, probe: &mut Probe) {
let row = match vista.get_some_value().await {
Ok(Some((_, row))) => Some(row),
_ => None,
};
for reference in vista.references().values() {
let relation = reference.name.as_str();
let from_row = vista.get_ref(relation, Some(&row.clone().unwrap_or_default()));
probe.check(
Capability::Traverse,
&format!("get_ref({relation}, Some(row))"),
&from_row,
);
if let (Ok(target), Some(_)) = (&from_row, &row)
&& !reference.kind.is_contained()
&& !reference.keys.is_empty()
&& !target.is_narrowed()
{
probe.fail(format!(
"`traverse`: get_ref({relation}, Some(row)) returned a target whose query() \
records no narrowing; narrow it through Vista::add_condition"
));
}
probe.check(
Capability::Traverse,
&format!("get_ref({relation}, None)"),
&vista.get_ref(relation, None).map(drop),
);
}
}