use std::sync::Arc;
use indexmap::IndexMap;
use vantage_vista::{Column, Reference, VistaCapabilities};
use super::DioInner;
pub struct DioShell {
pub(crate) dio: Arc<DioInner>,
pub(crate) capabilities: VistaCapabilities,
pub(crate) columns: IndexMap<String, Column>,
pub(crate) references: IndexMap<String, Reference>,
pub(crate) id_column: Option<String>,
}
impl DioShell {
pub(crate) fn new(dio: Arc<DioInner>) -> Self {
let master = dio.master.read().unwrap();
let master_caps = master.capabilities().clone();
let columns = master.source.columns().clone();
let references = master.source.references().clone();
let id_column = master.source.id_column().map(str::to_string);
drop(master);
let cbs = &dio.lens.callbacks;
let has_flash_route = cbs.on_flash.is_some();
let has_on_event = cbs.on_event.is_some();
let capabilities = VistaCapabilities {
can_count: true,
can_insert: master_caps.can_insert || has_flash_route,
can_update: master_caps.can_update || has_flash_route,
can_delete: master_caps.can_delete || has_flash_route,
can_subscribe: true,
can_invalidate: master_caps.can_invalidate || has_on_event,
can_order: master_caps.can_order,
can_search: master_caps.can_search,
can_set_page_size: master_caps.can_set_page_size,
can_fetch_page: master_caps.can_fetch_page,
can_fetch_next: master_caps.can_fetch_next,
can_fetch_window: true,
can_traverse_to_record: master_caps.can_traverse_to_record,
can_traverse_to_set: master_caps.can_traverse_to_set,
can_build_ref_via_script: master_caps.can_build_ref_via_script,
can_traverse_in_columns: master_caps.can_traverse_in_columns,
};
Self {
dio,
capabilities,
columns,
references,
id_column,
}
}
}