use rudb_common::{Result, Value};
use rudb_functions::strategy_fields;
use rudb_plan::{Plan, Slice};
use rudb_seam::{SeamId, StrategyRow};
use crate::metadata::{Metadata, text};
use crate::register::registries;
pub(crate) fn strategies(plan: &Plan, index: u32, columns: Slice) -> Result<Metadata> {
let registered = registries().rows();
let mut rows = Vec::new();
for seam in SeamId::ALL.iter().copied() {
let mut any = false;
for row in registered.iter().filter(|row| row.seam == seam) {
rows.push(implemented(row));
any = true;
}
if !any {
rows.push(planned(seam));
}
}
Metadata::new("rudb_strategies", &strategy_fields(), &rows, plan, index, columns)
}
fn implemented(row: &StrategyRow) -> Vec<Value> {
vec![
text(row.seam.name()),
text(row.seam.milestone()),
text(row.seam.describe()),
text(row.name),
text(row.describe),
text(&row.provenance.to_string()),
text(&row.determinism.to_string()),
Value::Boolean(row.is_reference),
Value::Boolean(row.is_default),
]
}
fn planned(seam: SeamId) -> Vec<Value> {
vec![
text(seam.name()),
text(seam.milestone()),
text(seam.describe()),
Value::Null,
Value::Null,
Value::Null,
Value::Null,
Value::Null,
Value::Null,
]
}