chore: fix transform field type error

This commit is contained in:
appflowy 2022-04-10 20:21:28 +08:00
parent 43095cb0dd
commit 9d629412c8
12 changed files with 71 additions and 44 deletions

View File

@ -30,7 +30,7 @@ macro_rules! impl_type_option {
($target: ident, $field_type:expr) => {
impl std::convert::From<&FieldMeta> for $target {
fn from(field_meta: &FieldMeta) -> $target {
match field_meta.get_type_option_entry::<$target>(Some($field_type)) {
match field_meta.get_type_option_entry::<$target>(&$field_type) {
None => $target::default(),
Some(target) => target,
}
@ -63,7 +63,7 @@ macro_rules! impl_type_option {
}
}
impl TypeOptionDataEntity for $target {
impl TypeOptionDataDeserializer for $target {
fn from_json_str(s: &str) -> $target {
match serde_json::from_str(s) {
Ok(obj) => obj,

View File

@ -4,7 +4,10 @@ use crate::services::row::{CellDataChangeset, CellDataOperation, TypeOptionCellD
use bytes::Bytes;
use flowy_derive::ProtoBuf;
use flowy_error::FlowyError;
use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry};
use flowy_grid_data_model::entities::{
CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
};
use serde::{Deserialize, Serialize};
use std::str::FromStr;

View File

@ -5,7 +5,10 @@ use chrono::format::strftime::StrftimeItems;
use chrono::NaiveDateTime;
use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
use flowy_error::FlowyError;
use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry};
use flowy_grid_data_model::entities::{
CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
};
use serde::{Deserialize, Serialize};
use std::str::FromStr;

View File

@ -2,7 +2,10 @@ use crate::impl_type_option;
use crate::services::row::{CellDataChangeset, CellDataOperation, TypeOptionCellData};
use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
use flowy_error::FlowyError;
use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry};
use flowy_grid_data_model::entities::{
CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
};
use lazy_static::lazy_static;
use rust_decimal::Decimal;

View File

@ -7,7 +7,7 @@ use bytes::Bytes;
use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
use flowy_error::{ErrorCode, FlowyError};
use flowy_grid_data_model::entities::{
CellMeta, CellMetaChangeset, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry,
CellMeta, CellMetaChangeset, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
};
use flowy_grid_data_model::parser::NotEmptyUuid;
use serde::{Deserialize, Serialize};

View File

@ -4,7 +4,9 @@ use crate::services::row::{decode_cell_data, CellDataChangeset, CellDataOperatio
use bytes::Bytes;
use flowy_derive::ProtoBuf;
use flowy_error::FlowyError;
use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry};
use flowy_grid_data_model::entities::{
CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
};
use serde::{Deserialize, Serialize};
use std::str::FromStr;
@ -38,7 +40,7 @@ impl CellDataOperation for RichTextTypeOption {
|| type_option_cell_data.is_multi_select()
|| type_option_cell_data.is_number()
{
decode_cell_data(data, field_meta).unwrap_or_else(|_| "".to_owned())
decode_cell_data(data, &field_meta, &type_option_cell_data.field_type).unwrap_or_else(|| "".to_owned())
} else {
type_option_cell_data.data
}

View File

@ -106,17 +106,43 @@ pub fn apply_cell_data_changeset<T: Into<CellDataChangeset>>(
FieldType::Checkbox => CheckboxTypeOption::from(field_meta).apply_changeset(changeset, cell_meta),
}
}
//
// #[tracing::instrument(level = "trace", skip(field_meta, data), fields(content), err)]
// pub fn decode_cell_data(data: String, field_meta: &FieldMeta, field_type: &FieldType) -> Result<String, FlowyError> {
// let s = match field_meta.field_type {
// FieldType::RichText => RichTextTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// FieldType::Number => NumberTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// FieldType::DateTime => DateTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// FieldType::SingleSelect => SingleSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// FieldType::MultiSelect => MultiSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// FieldType::Checkbox => CheckboxTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// };
// tracing::Span::current().record("content", &format!("{:?}: {}", field_meta.field_type, s).as_str());
// Ok(s)
// }
#[tracing::instrument(level = "trace", skip(field_meta, data), fields(content), err)]
pub fn decode_cell_data(data: String, field_meta: &FieldMeta) -> Result<String, FlowyError> {
let s = match field_meta.field_type {
FieldType::RichText => RichTextTypeOption::from(field_meta).decode_cell_data(data, field_meta),
FieldType::Number => NumberTypeOption::from(field_meta).decode_cell_data(data, field_meta),
FieldType::DateTime => DateTypeOption::from(field_meta).decode_cell_data(data, field_meta),
FieldType::SingleSelect => SingleSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta),
FieldType::MultiSelect => MultiSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta),
FieldType::Checkbox => CheckboxTypeOption::from(field_meta).decode_cell_data(data, field_meta),
#[tracing::instrument(level = "trace", skip(field_meta, data), fields(content))]
pub fn decode_cell_data(data: String, field_meta: &FieldMeta, field_type: &FieldType) -> Option<String> {
let s = match field_type {
FieldType::RichText => field_meta
.get_type_option_entry::<RichTextTypeOption>(field_type)?
.decode_cell_data(data, field_meta),
FieldType::Number => field_meta
.get_type_option_entry::<NumberTypeOption>(field_type)?
.decode_cell_data(data, field_meta),
FieldType::DateTime => field_meta
.get_type_option_entry::<DateTypeOption>(field_type)?
.decode_cell_data(data, field_meta),
FieldType::SingleSelect => field_meta
.get_type_option_entry::<SingleSelectTypeOption>(field_type)?
.decode_cell_data(data, field_meta),
FieldType::MultiSelect => field_meta
.get_type_option_entry::<MultiSelectTypeOption>(field_type)?
.decode_cell_data(data, field_meta),
FieldType::Checkbox => field_meta
.get_type_option_entry::<CheckboxTypeOption>(field_type)?
.decode_cell_data(data, field_meta),
};
tracing::Span::current().record("content", &format!("{:?}: {}", field_meta.field_type, s).as_str());
Ok(s)
Some(s)
}

View File

@ -34,28 +34,16 @@ pub fn make_cell_by_field_id(
cell_meta: CellMeta,
) -> Option<(String, Cell)> {
let field_meta = field_map.get(&field_id)?;
match decode_cell_data(cell_meta.data, field_meta) {
Ok(content) => {
let cell = Cell::new(&field_id, content);
Some((field_id, cell))
}
Err(e) => {
tracing::error!("{}", e);
None
}
}
let content = decode_cell_data(cell_meta.data, field_meta, &field_meta.field_type)?;
let cell = Cell::new(&field_id, content);
Some((field_id, cell))
}
#[allow(dead_code)]
pub fn make_cell(field_id: &str, field_meta: &FieldMeta, row_meta: &RowMeta) -> Option<Cell> {
let cell_meta = row_meta.cells.get(field_id)?.clone();
match decode_cell_data(cell_meta.data, field_meta) {
Ok(content) => Some(Cell::new(field_id, content)),
Err(e) => {
tracing::error!("{}", e);
None
}
}
let content = decode_cell_data(cell_meta.data, field_meta, &field_meta.field_type)?;
Some(Cell::new(field_id, content))
}
pub(crate) fn make_row_orders_from_row_metas(row_metas: &[Arc<RowMeta>]) -> Vec<RowOrder> {

View File

@ -287,7 +287,7 @@ async fn grid_row_add_date_cell_test() {
let date_field = date_field.unwrap();
let cell_data = context.cell_by_field_id.get(&date_field.id).unwrap().clone();
assert_eq!(
decode_cell_data(cell_data.data.clone(), &date_field).unwrap(),
decode_cell_data(cell_data.data.clone(), &date_field, &date_field.field_type).unwrap(),
"2022/03/16 08:31",
);
let scripts = vec![CreateRow { context }];

View File

@ -258,7 +258,7 @@ pub fn create_text_field(grid_id: &str) -> (CreateFieldParams, FieldMeta) {
let cloned_field_meta = field_meta.clone();
let type_option_data = field_meta
.get_type_option_entry::<RichTextTypeOption>(None)
.get_type_option_entry::<RichTextTypeOption>(&field_meta.field_type)
.unwrap()
.protobuf_bytes()
.to_vec();
@ -290,7 +290,7 @@ pub fn create_single_select_field(grid_id: &str) -> (CreateFieldParams, FieldMet
let field_meta = FieldBuilder::new(single_select).name("Name").visibility(true).build();
let cloned_field_meta = field_meta.clone();
let type_option_data = field_meta
.get_type_option_entry::<SingleSelectTypeOption>(None)
.get_type_option_entry::<SingleSelectTypeOption>(&field_meta.field_type)
.unwrap()
.protobuf_bytes()
.to_vec();

View File

@ -122,12 +122,14 @@ impl FieldMeta {
}
}
pub fn insert_type_option_entry<T: TypeOptionDataEntry + ?Sized>(&mut self, entry: &T) {
pub fn insert_type_option_entry<T>(&mut self, entry: &T)
where
T: TypeOptionDataEntry + ?Sized,
{
self.type_options.insert(entry.field_type().type_id(), entry.json_str());
}
pub fn get_type_option_entry<T: TypeOptionDataEntity>(&self, field_type: Option<FieldType>) -> Option<T> {
let field_type = field_type.as_ref().unwrap_or(&self.field_type);
pub fn get_type_option_entry<T: TypeOptionDataDeserializer>(&self, field_type: &FieldType) -> Option<T> {
self.type_options
.get(&field_type.type_id())
.map(|s| T::from_json_str(s))
@ -149,7 +151,7 @@ pub trait TypeOptionDataEntry {
fn protobuf_bytes(&self) -> Bytes;
}
pub trait TypeOptionDataEntity {
pub trait TypeOptionDataDeserializer {
fn from_json_str(s: &str) -> Self;
fn from_protobuf_bytes(bytes: Bytes) -> Self;
}

View File

@ -165,8 +165,8 @@ impl GridBlockMetaPad {
Some(delta) => {
tracing::debug!("[GridBlockMeta] Composing delta {}", delta.to_delta_str());
tracing::debug!(
"[GridBlockMeta] Composing str {}",
delta.to_str().unwrap_or("".to_string())
"[GridBlockMeta] current delta: {}",
self.delta.to_str().unwrap_or("".to_string())
);
self.delta = self.delta.compose(&delta)?;
Ok(Some(GridBlockMetaChange { delta, md5: self.md5() }))