use crate::services::group::Group; use flowy_error::FlowyResult; use flowy_grid_data_model::revision::{ FieldRevision, FieldTypeRevision, GroupConfigurationContentSerde, GroupConfigurationRevision, GroupRecordRevision, }; use lib_infra::future::AFFuture; use std::sync::Arc; pub trait GroupConfigurationReader: Send + Sync + 'static { fn get_group_configuration(&self, field_rev: Arc) -> AFFuture>; } pub trait GroupConfigurationWriter: Send + Sync + 'static { fn save_group_configuration( &self, field_id: &str, field_type: FieldTypeRevision, configuration: GroupConfigurationRevision, ) -> AFFuture>; } pub trait GroupConfigurationAction: Send + Sync { fn group_records(&self) -> &[GroupRecordRevision]; fn merge_groups(&self, groups: Vec) -> FlowyResult<()>; fn hide_group(&self, group_id: &str) -> FlowyResult<()>; fn show_group(&self, group_id: &str) -> FlowyResult<()>; } pub struct GenericGroupConfiguration { field_rev: Arc, reader: Arc, configuration_rev: Arc, writer: Arc, pub(crate) configuration: C, } impl GenericGroupConfiguration where C: GroupConfigurationContentSerde, { pub async fn new( field_rev: Arc, reader: Arc, writer: Arc, ) -> FlowyResult { let configuration_rev = reader.get_group_configuration(field_rev.clone()).await; let configuration = C::from_configuration_content(&configuration.content)?; Ok(Self { field_rev, configuration_rev, reader, writer, configuration, }) } pub async fn save_configuration(&self) {} } impl GroupConfigurationReader for Arc where T: GroupConfigurationReader, { fn get_group_configuration(&self, field_rev: Arc) -> AFFuture> { (**self).get_group_configuration(field_rev) } } impl GroupConfigurationWriter for Arc where T: GroupConfigurationWriter, { fn save_group_configuration( &self, field_id: &str, field_type: FieldTypeRevision, configuration: GroupConfigurationRevision, ) -> AFFuture> { (**self).save_group_configuration(field_id, field_type, configuration) } }