use perspective_client::config::{ColumnType, ViewConfig};
use crate::presentation::{ColumnLocator, ColumnSettingsTarget, OpenColumnSettings};
use crate::renderer::Renderer;
use crate::session::SessionMetadata;
pub fn classify_column(
name: &str,
view_config: &ViewConfig,
metadata: &SessionMetadata,
) -> Option<ColumnLocator> {
if view_config.windows.contains_key(name) || metadata.is_column_window(name) {
Some(ColumnLocator::Window(name.to_owned()))
} else if view_config.expressions.contains_key(name) || metadata.is_column_expression(name) {
Some(ColumnLocator::Expression(name.to_owned()))
} else if metadata
.get_table_columns()
.is_some_and(|cols| cols.iter().any(|col| col == name))
{
Some(ColumnLocator::Table(name.to_owned()))
} else {
None
}
}
pub fn is_pivot_column(name: &str, view_config: &ViewConfig) -> bool {
view_config.group_by.iter().any(|col| col == name)
|| view_config.split_by.iter().any(|col| col == name)
}
pub fn is_pivot_only_column(name: &str, view_config: &ViewConfig) -> bool {
is_pivot_column(name, view_config)
&& !view_config
.columns
.iter()
.any(|col| col.as_deref() == Some(name))
}
pub fn has_column_config(
name: &str,
view_config: &ViewConfig,
metadata: &SessionMetadata,
renderer: &Renderer,
) -> bool {
if !renderer.can_render_column_styles() {
return false;
}
if view_config
.columns
.iter()
.any(|col| col.as_deref() == Some(name))
{
return true;
}
is_pivot_column(name, view_config)
&& matches!(
metadata.get_column_table_type(name),
Some(ColumnType::Integer | ColumnType::Float | ColumnType::Date | ColumnType::Datetime)
)
}
pub fn get_current_column_locator(
open_column_settings: &OpenColumnSettings,
renderer: &Renderer,
view_config: &ViewConfig,
metadata: &SessionMetadata,
) -> Option<ColumnLocator> {
match open_column_settings.target.as_ref()? {
ColumnSettingsTarget::NewExpression => Some(ColumnLocator::NewExpression),
ColumnSettingsTarget::Column(name) => {
let locator = classify_column(name, view_config, metadata)?;
match locator {
ColumnLocator::Table(_) => {
has_column_config(name, view_config, metadata, renderer).then_some(locator)
},
locator => Some(locator),
}
},
}
}