mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
refactor: cell data parser
This commit is contained in:
parent
707ddb4e73
commit
e29aaf8388
@ -132,11 +132,11 @@ impl CellBytes {
|
|||||||
Ok(Self(bytes))
|
Ok(Self(bytes))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_parser<P>(&self, parser: P) -> FlowyResult<P::Object>
|
pub fn with_parser<P>(&self) -> FlowyResult<P::Object>
|
||||||
where
|
where
|
||||||
P: CellBytesParser,
|
P: CellBytesParser,
|
||||||
{
|
{
|
||||||
parser.parse(&self.0)
|
P::parse(&self.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn parse<'a, T: TryFrom<&'a [u8]>>(&'a self) -> FlowyResult<T>
|
// pub fn parse<'a, T: TryFrom<&'a [u8]>>(&'a self) -> FlowyResult<T>
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
use crate::services::cell::{decode_any_cell_data, CellBytes};
|
use crate::services::cell::{decode_any_cell_data, CellBytes, CellBytesParser};
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use flowy_error::FlowyResult;
|
use flowy_error::FlowyResult;
|
||||||
use flowy_grid_data_model::revision::{
|
use flowy_grid_data_model::revision::{
|
||||||
CellRevision, FieldRevision, GroupConfigurationRevision, RowRevision, TypeOptionDataDeserializer,
|
CellRevision, FieldRevision, GroupConfigurationRevision, RowRevision, TypeOptionDataDeserializer,
|
||||||
};
|
};
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
pub trait GroupAction {
|
pub trait GroupAction<CD> {
|
||||||
fn should_group(&mut self, content: &str, cell_bytes: CellBytes) -> bool;
|
fn should_group(&self, content: &str, cell_data: CD) -> bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait GroupCellContentProvider {
|
pub trait GroupCellContentProvider {
|
||||||
@ -24,15 +25,16 @@ pub trait GroupGenerator<C, T> {
|
|||||||
configuration: &Option<C>,
|
configuration: &Option<C>,
|
||||||
type_option: &Option<T>,
|
type_option: &Option<T>,
|
||||||
cell_content_provider: &dyn GroupCellContentProvider,
|
cell_content_provider: &dyn GroupCellContentProvider,
|
||||||
) -> Vec<Group>;
|
) -> HashMap<String, Group>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct GroupController<C, T, G> {
|
pub struct GroupController<C, T, G, CP> {
|
||||||
field_rev: Arc<FieldRevision>,
|
field_rev: Arc<FieldRevision>,
|
||||||
groups: Vec<Group>,
|
groups: HashMap<String, Group>,
|
||||||
type_option: Option<T>,
|
type_option: Option<T>,
|
||||||
configuration: Option<C>,
|
configuration: Option<C>,
|
||||||
phantom: PhantomData<G>,
|
group_action_phantom: PhantomData<G>,
|
||||||
|
cell_parser_phantom: PhantomData<CP>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Group {
|
pub struct Group {
|
||||||
@ -40,7 +42,7 @@ pub struct Group {
|
|||||||
content: String,
|
content: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<C, T, G> GroupController<C, T, G>
|
impl<C, T, G, CP> GroupController<C, T, G, CP>
|
||||||
where
|
where
|
||||||
C: TryFrom<Bytes, Error = protobuf::ProtobufError>,
|
C: TryFrom<Bytes, Error = protobuf::ProtobufError>,
|
||||||
T: TypeOptionDataDeserializer,
|
T: TypeOptionDataDeserializer,
|
||||||
@ -62,27 +64,39 @@ where
|
|||||||
groups: G::gen_groups(&configuration, &type_option, cell_content_provider),
|
groups: G::gen_groups(&configuration, &type_option, cell_content_provider),
|
||||||
type_option,
|
type_option,
|
||||||
configuration,
|
configuration,
|
||||||
phantom: PhantomData,
|
group_action_phantom: PhantomData,
|
||||||
|
cell_parser_phantom: PhantomData,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<C, T, G> GroupController<C, T, G>
|
impl<C, T, G, CP> GroupController<C, T, G, CP>
|
||||||
where
|
where
|
||||||
Self: GroupAction,
|
CP: CellBytesParser,
|
||||||
|
Self: GroupAction<CP::Object>,
|
||||||
{
|
{
|
||||||
pub fn group_row(&mut self, row: &RowRevision) {
|
pub fn group_row(&mut self, row: &RowRevision) {
|
||||||
if self.configuration.is_none() {
|
if self.configuration.is_none() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if let Some(cell_rev) = row.cells.get(&self.field_rev.id) {
|
if let Some(cell_rev) = row.cells.get(&self.field_rev.id) {
|
||||||
for group in self.groups.iter_mut() {
|
let mut group_row_id = None;
|
||||||
|
let cell_bytes = decode_any_cell_data(cell_rev.data.clone(), &self.field_rev);
|
||||||
|
// let cell_data = cell_bytes.with_parser(CP);
|
||||||
|
for group in self.groups.values() {
|
||||||
let cell_rev: CellRevision = cell_rev.clone();
|
let cell_rev: CellRevision = cell_rev.clone();
|
||||||
let cell_bytes = decode_any_cell_data(cell_rev.data, &self.field_rev);
|
|
||||||
// if self.should_group(&group.content, cell_bytes) {
|
// if self.should_group(&group.content, cell_bytes) {
|
||||||
// group.row_ids.push(row.id.clone());
|
// group_row_id = Some(row.id.clone());
|
||||||
|
// break;
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(group_row_id) = group_row_id {
|
||||||
|
self.groups.get_mut(&group_row_id).map(|group| {
|
||||||
|
group.row_ids.push(group_row_id);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,44 +1,52 @@
|
|||||||
use crate::entities::SelectOptionGroupConfigurationPB;
|
use crate::entities::SelectOptionGroupConfigurationPB;
|
||||||
use crate::services::cell::CellBytes;
|
use crate::services::cell::CellBytes;
|
||||||
use crate::services::field::{MultiSelectTypeOptionPB, SelectedSelectOptions, SingleSelectTypeOptionPB};
|
use crate::services::field::{
|
||||||
|
MultiSelectTypeOptionPB, SelectOptionCellDataPB, SelectOptionCellDataParser, SelectedSelectOptions,
|
||||||
|
SingleSelectTypeOptionPB,
|
||||||
|
};
|
||||||
use crate::services::group::{Group, GroupAction, GroupCellContentProvider, GroupController, GroupGenerator};
|
use crate::services::group::{Group, GroupAction, GroupCellContentProvider, GroupController, GroupGenerator};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
pub type SingleSelectGroupController =
|
pub type SingleSelectGroupController = GroupController<
|
||||||
GroupController<SelectOptionGroupConfigurationPB, SingleSelectTypeOptionPB, SingleSelectGroupGen>;
|
SelectOptionGroupConfigurationPB,
|
||||||
|
SingleSelectTypeOptionPB,
|
||||||
|
SingleSelectGroupGenerator,
|
||||||
|
SelectOptionCellDataParser,
|
||||||
|
>;
|
||||||
|
|
||||||
pub struct SingleSelectGroupGen();
|
pub struct SingleSelectGroupGenerator();
|
||||||
impl GroupGenerator<SelectOptionGroupConfigurationPB, SingleSelectTypeOptionPB> for SingleSelectGroupGen {
|
impl GroupGenerator<SelectOptionGroupConfigurationPB, SingleSelectTypeOptionPB> for SingleSelectGroupGenerator {
|
||||||
fn gen_groups(
|
fn gen_groups(
|
||||||
configuration: &Option<SelectOptionGroupConfigurationPB>,
|
configuration: &Option<SelectOptionGroupConfigurationPB>,
|
||||||
type_option: &Option<SingleSelectTypeOptionPB>,
|
type_option: &Option<SingleSelectTypeOptionPB>,
|
||||||
cell_content_provider: &dyn GroupCellContentProvider,
|
cell_content_provider: &dyn GroupCellContentProvider,
|
||||||
) -> Vec<Group> {
|
) -> HashMap<String, Group> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GroupAction for SingleSelectGroupController {
|
impl GroupAction<SelectOptionCellDataPB> for SingleSelectGroupController {
|
||||||
fn should_group(&mut self, content: &str, cell_bytes: CellBytes) -> bool {
|
fn should_group(&self, content: &str, cell_data: SelectOptionCellDataPB) -> bool {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type MultiSelectGroupController =
|
// pub type MultiSelectGroupController =
|
||||||
GroupController<SelectOptionGroupConfigurationPB, MultiSelectTypeOptionPB, MultiSelectGroupGen>;
|
// GroupController<SelectOptionGroupConfigurationPB, MultiSelectTypeOptionPB, MultiSelectGroupGenerator>;
|
||||||
|
//
|
||||||
pub struct MultiSelectGroupGen();
|
// pub struct MultiSelectGroupGenerator();
|
||||||
impl GroupGenerator<SelectOptionGroupConfigurationPB, MultiSelectTypeOptionPB> for MultiSelectGroupGen {
|
// impl GroupGenerator<SelectOptionGroupConfigurationPB, MultiSelectTypeOptionPB> for MultiSelectGroupGenerator {
|
||||||
fn gen_groups(
|
// fn gen_groups(
|
||||||
configuration: &Option<SelectOptionGroupConfigurationPB>,
|
// configuration: &Option<SelectOptionGroupConfigurationPB>,
|
||||||
type_option: &Option<MultiSelectTypeOptionPB>,
|
// type_option: &Option<MultiSelectTypeOptionPB>,
|
||||||
cell_content_provider: &dyn GroupCellContentProvider,
|
// cell_content_provider: &dyn GroupCellContentProvider,
|
||||||
) -> Vec<Group> {
|
// ) -> HashMap<String, Group> {
|
||||||
todo!()
|
// todo!()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
impl GroupAction for MultiSelectGroupController {
|
// impl GroupAction for MultiSelectGroupController {
|
||||||
fn should_group(&mut self, content: &str, cell_bytes: CellBytes) -> bool {
|
// fn should_group(&self, content: &str, cell_bytes: CellBytes) -> bool {
|
||||||
todo!()
|
// todo!()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user