use perspective_js::utils::ApiError;
use crate::js::plugin::*;
#[derive(Clone, Copy, Debug, Default, PartialEq)]
pub struct RenderLimits {
pub is_update: bool,
pub num_cols: usize,
pub num_rows: usize,
pub max_cols: Option<usize>,
pub max_rows: Option<usize>,
}
pub async fn get_row_and_col_limits(
view: &perspective_client::View,
plugin_metadata: &ViewConfigRequirements,
) -> Result<RenderLimits, ApiError> {
let dimensions = view.dimensions().await?;
let num_cols = dimensions.num_view_columns as usize;
let num_rows = dimensions.num_view_rows as usize;
match (plugin_metadata.max_columns, plugin_metadata.render_warning) {
(Some(_), false) => Ok(RenderLimits {
is_update: false,
num_cols,
num_rows,
max_cols: None,
max_rows: None,
}),
(max_columns, _) => {
let schema = view.schema().await?;
let keys = schema.keys();
let num_schema_columns = std::cmp::max(1, keys.len() as usize);
let max_cols = max_columns.and_then(|max_columns| {
let column_group_diff = max_columns % num_schema_columns;
let column_limit = max_columns + column_group_diff;
if column_limit < num_cols {
Some(column_limit)
} else {
None
}
});
let max_rows = plugin_metadata.max_cells.map(|max_cells| {
match max_cols {
Some(max_cols) => max_cells as f64 / max_cols as f64,
None => max_cells as f64 / num_cols as f64,
}
.ceil() as usize
});
Ok(RenderLimits {
is_update: false,
num_cols,
num_rows,
max_cols,
max_rows,
})
},
}
}