use vantage_core::{VantageError, error};
use crate::metadata::VistaMetadata;
pub(crate) fn refuse_path(column: &str) -> VantageError {
error!("this shell doesn't evaluate a dotted path", column = column).mark_unimplemented()
}
pub fn condition_column_error(metadata: &VistaMetadata, column: &str) -> VantageError {
let columns = &metadata.columns;
let nested = column.split_once('.').is_some_and(|(root, _)| {
columns.is_empty() || columns.contains_key(column) || columns.contains_key(root)
});
if nested {
refuse_path(column)
} else {
error!("Unknown column for condition", field = column)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Column;
#[test]
fn a_path_into_a_declared_root_is_refused() {
let metadata = VistaMetadata::new()
.with_column(Column::new("dims", "map"))
.with_column(Column::new("author.name", "String"));
let refused = condition_column_error(&metadata, "dims.w");
assert!(refused.is_unimplemented(), "{refused:?}");
assert!(refused.to_string().contains("dotted path"), "{refused}");
for unknown in ["colour", "colour.hue", "author"] {
let err = condition_column_error(&metadata, unknown);
assert!(
!err.is_unimplemented() && !err.is_unsupported(),
"{unknown}"
);
assert!(err.to_string().contains("Unknown column"), "{err}");
}
}
#[test]
fn a_declared_dotted_column_is_refused_as_a_path() {
let metadata = VistaMetadata::new()
.with_column(Column::new("id", "String"))
.with_column(Column::new("author.name", "String"));
let refused = condition_column_error(&metadata, "author.name");
assert!(refused.is_unimplemented(), "{refused:?}");
assert!(refused.to_string().contains("dotted path"), "{refused}");
}
#[test]
fn a_schemaless_shell_refuses_every_path() {
let err = condition_column_error(&VistaMetadata::new(), "colour.hue");
assert!(err.is_unimplemented(), "{err:?}");
let flat = condition_column_error(&VistaMetadata::new(), "colour");
assert!(!flat.is_unimplemented(), "{flat:?}");
}
}