view.rs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. use crate::{
  2. entities::parser::{
  3. app::AppIdentify,
  4. view::{ViewDesc, ViewIdentify, ViewName, ViewThumbnail},
  5. },
  6. errors::ErrorCode,
  7. impl_def_and_def_mut,
  8. };
  9. use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
  10. use flowy_folder_data_model::revision::{gen_view_id, ViewDataTypeRevision, ViewRevision};
  11. use std::convert::TryInto;
  12. #[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]
  13. pub struct ViewPB {
  14. #[pb(index = 1)]
  15. pub id: String,
  16. #[pb(index = 2)]
  17. pub belong_to_id: String,
  18. #[pb(index = 3)]
  19. pub name: String,
  20. #[pb(index = 4)]
  21. pub data_type: ViewDataType,
  22. #[pb(index = 5)]
  23. pub modified_time: i64,
  24. #[pb(index = 6)]
  25. pub create_time: i64,
  26. #[pb(index = 7)]
  27. pub plugin_type: i32,
  28. }
  29. impl std::convert::From<ViewRevision> for ViewPB {
  30. fn from(rev: ViewRevision) -> Self {
  31. ViewPB {
  32. id: rev.id,
  33. belong_to_id: rev.belong_to_id,
  34. name: rev.name,
  35. data_type: rev.data_type.into(),
  36. modified_time: rev.modified_time,
  37. create_time: rev.create_time,
  38. plugin_type: rev.plugin_type,
  39. }
  40. }
  41. }
  42. #[derive(Eq, PartialEq, Hash, Debug, ProtoBuf_Enum, Clone)]
  43. pub enum ViewDataType {
  44. TextBlock = 0,
  45. Grid = 1,
  46. }
  47. impl std::default::Default for ViewDataType {
  48. fn default() -> Self {
  49. ViewDataTypeRevision::default().into()
  50. }
  51. }
  52. impl std::convert::From<ViewDataTypeRevision> for ViewDataType {
  53. fn from(rev: ViewDataTypeRevision) -> Self {
  54. match rev {
  55. ViewDataTypeRevision::TextBlock => ViewDataType::TextBlock,
  56. ViewDataTypeRevision::Grid => ViewDataType::Grid,
  57. }
  58. }
  59. }
  60. impl std::convert::From<ViewDataType> for ViewDataTypeRevision {
  61. fn from(ty: ViewDataType) -> Self {
  62. match ty {
  63. ViewDataType::TextBlock => ViewDataTypeRevision::TextBlock,
  64. ViewDataType::Grid => ViewDataTypeRevision::Grid,
  65. }
  66. }
  67. }
  68. #[derive(Eq, PartialEq, Debug, Default, ProtoBuf, Clone)]
  69. pub struct RepeatedViewPB {
  70. #[pb(index = 1)]
  71. pub items: Vec<ViewPB>,
  72. }
  73. impl_def_and_def_mut!(RepeatedViewPB, ViewPB);
  74. impl std::convert::From<Vec<ViewRevision>> for RepeatedViewPB {
  75. fn from(values: Vec<ViewRevision>) -> Self {
  76. let items = values.into_iter().map(|value| value.into()).collect::<Vec<ViewPB>>();
  77. RepeatedViewPB { items }
  78. }
  79. }
  80. #[derive(Default, ProtoBuf)]
  81. pub struct RepeatedViewIdPB {
  82. #[pb(index = 1)]
  83. pub items: Vec<String>,
  84. }
  85. #[derive(Default, ProtoBuf)]
  86. pub struct CreateViewPayloadPB {
  87. #[pb(index = 1)]
  88. pub belong_to_id: String,
  89. #[pb(index = 2)]
  90. pub name: String,
  91. #[pb(index = 3)]
  92. pub desc: String,
  93. #[pb(index = 4, one_of)]
  94. pub thumbnail: Option<String>,
  95. #[pb(index = 5)]
  96. pub data_type: ViewDataType,
  97. #[pb(index = 6)]
  98. pub plugin_type: i32,
  99. #[pb(index = 7)]
  100. pub data: Vec<u8>,
  101. }
  102. #[derive(Debug, Clone)]
  103. pub struct CreateViewParams {
  104. pub belong_to_id: String,
  105. pub name: String,
  106. pub desc: String,
  107. pub thumbnail: String,
  108. pub data_type: ViewDataType,
  109. pub view_id: String,
  110. pub data: Vec<u8>,
  111. pub plugin_type: i32,
  112. }
  113. impl TryInto<CreateViewParams> for CreateViewPayloadPB {
  114. type Error = ErrorCode;
  115. fn try_into(self) -> Result<CreateViewParams, Self::Error> {
  116. let name = ViewName::parse(self.name)?.0;
  117. let belong_to_id = AppIdentify::parse(self.belong_to_id)?.0;
  118. let view_id = gen_view_id();
  119. let thumbnail = match self.thumbnail {
  120. None => "".to_string(),
  121. Some(thumbnail) => ViewThumbnail::parse(thumbnail)?.0,
  122. };
  123. Ok(CreateViewParams {
  124. belong_to_id,
  125. name,
  126. desc: self.desc,
  127. data_type: self.data_type,
  128. thumbnail,
  129. view_id,
  130. data: self.data,
  131. plugin_type: self.plugin_type,
  132. })
  133. }
  134. }
  135. #[derive(Default, ProtoBuf, Clone, Debug)]
  136. pub struct ViewIdPB {
  137. #[pb(index = 1)]
  138. pub value: String,
  139. }
  140. impl std::convert::From<&str> for ViewIdPB {
  141. fn from(value: &str) -> Self {
  142. ViewIdPB {
  143. value: value.to_string(),
  144. }
  145. }
  146. }
  147. impl std::ops::Deref for ViewIdPB {
  148. type Target = str;
  149. fn deref(&self) -> &Self::Target {
  150. &self.value
  151. }
  152. }
  153. #[derive(Default, ProtoBuf)]
  154. pub struct UpdateViewPayloadPB {
  155. #[pb(index = 1)]
  156. pub view_id: String,
  157. #[pb(index = 2, one_of)]
  158. pub name: Option<String>,
  159. #[pb(index = 3, one_of)]
  160. pub desc: Option<String>,
  161. #[pb(index = 4, one_of)]
  162. pub thumbnail: Option<String>,
  163. }
  164. #[derive(Clone, Debug)]
  165. pub struct UpdateViewParams {
  166. pub view_id: String,
  167. pub name: Option<String>,
  168. pub desc: Option<String>,
  169. pub thumbnail: Option<String>,
  170. }
  171. impl TryInto<UpdateViewParams> for UpdateViewPayloadPB {
  172. type Error = ErrorCode;
  173. fn try_into(self) -> Result<UpdateViewParams, Self::Error> {
  174. let view_id = ViewIdentify::parse(self.view_id)?.0;
  175. let name = match self.name {
  176. None => None,
  177. Some(name) => Some(ViewName::parse(name)?.0),
  178. };
  179. let desc = match self.desc {
  180. None => None,
  181. Some(desc) => Some(ViewDesc::parse(desc)?.0),
  182. };
  183. let thumbnail = match self.thumbnail {
  184. None => None,
  185. Some(thumbnail) => Some(ViewThumbnail::parse(thumbnail)?.0),
  186. };
  187. Ok(UpdateViewParams {
  188. view_id,
  189. name,
  190. desc,
  191. thumbnail,
  192. })
  193. }
  194. }
  195. #[derive(ProtoBuf_Enum)]
  196. pub enum MoveFolderItemType {
  197. MoveApp = 0,
  198. MoveView = 1,
  199. }
  200. impl std::default::Default for MoveFolderItemType {
  201. fn default() -> Self {
  202. MoveFolderItemType::MoveApp
  203. }
  204. }
  205. #[derive(Default, ProtoBuf)]
  206. pub struct MoveFolderItemPayloadPB {
  207. #[pb(index = 1)]
  208. pub item_id: String,
  209. #[pb(index = 2)]
  210. pub from: i32,
  211. #[pb(index = 3)]
  212. pub to: i32,
  213. #[pb(index = 4)]
  214. pub ty: MoveFolderItemType,
  215. }
  216. pub struct MoveFolderItemParams {
  217. pub item_id: String,
  218. pub from: usize,
  219. pub to: usize,
  220. pub ty: MoveFolderItemType,
  221. }
  222. impl TryInto<MoveFolderItemParams> for MoveFolderItemPayloadPB {
  223. type Error = ErrorCode;
  224. fn try_into(self) -> Result<MoveFolderItemParams, Self::Error> {
  225. let view_id = ViewIdentify::parse(self.item_id)?.0;
  226. Ok(MoveFolderItemParams {
  227. item_id: view_id,
  228. from: self.from as usize,
  229. to: self.to as usize,
  230. ty: self.ty,
  231. })
  232. }
  233. }
  234. // impl<'de> Deserialize<'de> for ViewDataType {
  235. // fn deserialize<D>(deserializer: D) -> Result<Self, <D as Deserializer<'de>>::Error>
  236. // where
  237. // D: Deserializer<'de>,
  238. // {
  239. // struct ViewTypeVisitor();
  240. //
  241. // impl<'de> Visitor<'de> for ViewTypeVisitor {
  242. // type Value = ViewDataType;
  243. // fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
  244. // formatter.write_str("RichText, PlainText")
  245. // }
  246. //
  247. // fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
  248. // where
  249. // E: de::Error,
  250. // {
  251. // let data_type;
  252. // match v {
  253. // 0 => {
  254. // data_type = ViewDataType::RichText;
  255. // }
  256. // 1 => {
  257. // data_type = ViewDataType::PlainText;
  258. // }
  259. // _ => {
  260. // return Err(de::Error::invalid_value(Unexpected::Unsigned(v as u64), &self));
  261. // }
  262. // }
  263. // Ok(data_type)
  264. // }
  265. //
  266. // fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
  267. // where
  268. // E: de::Error,
  269. // {
  270. // let data_type;
  271. // match s {
  272. // "Doc" | "RichText" => {
  273. // // Rename ViewDataType::Doc to ViewDataType::RichText, So we need to migrate the ViewType manually.
  274. // data_type = ViewDataType::RichText;
  275. // }
  276. // "PlainText" => {
  277. // data_type = ViewDataType::PlainText;
  278. // }
  279. // unknown => {
  280. // return Err(de::Error::invalid_value(Unexpected::Str(unknown), &self));
  281. // }
  282. // }
  283. // Ok(data_type)
  284. // }
  285. // }
  286. // deserializer.deserialize_any(ViewTypeVisitor())
  287. // }
  288. // }