deserialize.rs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. use crate::{derive_cache::TypeCategory, proto_buf::util::*};
  2. use flowy_ast::*;
  3. use proc_macro2::{Span, TokenStream};
  4. pub fn make_de_token_steam(ctxt: &Ctxt, ast: &ASTContainer) -> Option<TokenStream> {
  5. let pb_ty = ast.attrs.pb_struct_type()?;
  6. let struct_ident = &ast.ident;
  7. let build_take_fields = ast
  8. .data
  9. .all_fields()
  10. .filter(|f| !f.attrs.skip_deserializing())
  11. .flat_map(|field| {
  12. if let Some(func) = field.attrs.deserialize_with() {
  13. let member = &field.member;
  14. Some(quote! { o.#member=#struct_ident::#func(pb); })
  15. } else if field.attrs.is_one_of() {
  16. token_stream_for_one_of(ctxt, field)
  17. } else {
  18. token_stream_for_field(ctxt, &field.member, &field.ty, false)
  19. }
  20. });
  21. let de_token_stream: TokenStream = quote! {
  22. impl std::convert::TryFrom<&Vec<u8>> for #struct_ident {
  23. type Error = String;
  24. fn try_from(bytes: &Vec<u8>) -> Result<Self, Self::Error> {
  25. let result: ::protobuf::ProtobufResult<crate::protobuf::#pb_ty> = ::protobuf::Message::parse_from_bytes(bytes);
  26. match result {
  27. Ok(mut pb) => {
  28. #struct_ident::try_from(&mut pb)
  29. }
  30. Err(e) => Err(format!("{:?}", e)),
  31. }
  32. }
  33. }
  34. impl std::convert::TryFrom<&mut crate::protobuf::#pb_ty> for #struct_ident {
  35. type Error = String;
  36. fn try_from(pb: &mut crate::protobuf::#pb_ty) -> Result<Self, Self::Error> {
  37. let mut o = Self::default();
  38. #(#build_take_fields)*
  39. Ok(o)
  40. }
  41. }
  42. }
  43. .into();
  44. Some(de_token_stream)
  45. // None
  46. }
  47. fn token_stream_for_one_of(ctxt: &Ctxt, field: &ASTField) -> Option<TokenStream> {
  48. let member = &field.member;
  49. let ident = get_member_ident(ctxt, member)?;
  50. let ty_info = parse_ty(ctxt, &field.ty)?;
  51. let bracketed_ty_info = ty_info.bracket_ty_info.as_ref().as_ref();
  52. let has_func = format_ident!("has_{}", ident.to_string());
  53. // eprintln!("😁{:#?}", ty_info.primitive_ty);
  54. // eprintln!("{:#?}", ty_info.bracket_ty_info);
  55. match ident_category(bracketed_ty_info.unwrap().ident) {
  56. TypeCategory::Enum => {
  57. let get_func = format_ident!("get_{}", ident.to_string());
  58. let ty = ty_info.ty;
  59. Some(quote! {
  60. if pb.#has_func() {
  61. let enum_de_from_pb = #ty::try_from(&pb.#get_func()).unwrap();
  62. o.#member = Some(enum_de_from_pb);
  63. }
  64. })
  65. },
  66. TypeCategory::Primitive => {
  67. let get_func = format_ident!("get_{}", ident.to_string());
  68. Some(quote! {
  69. if pb.#has_func() {
  70. o.#member=Some(pb.#get_func());
  71. }
  72. })
  73. },
  74. TypeCategory::Str => {
  75. let take_func = format_ident!("take_{}", ident.to_string());
  76. Some(quote! {
  77. if pb.#has_func() {
  78. o.#member=Some(pb.#take_func());
  79. }
  80. })
  81. },
  82. TypeCategory::Array => {
  83. let take_func = format_ident!("take_{}", ident.to_string());
  84. Some(quote! {
  85. if pb.#has_func() {
  86. o.#member=Some(pb.#take_func());
  87. }
  88. })
  89. },
  90. _ => {
  91. let take_func = format_ident!("take_{}", ident.to_string());
  92. let ty = bracketed_ty_info.unwrap().ty;
  93. Some(quote! {
  94. if pb.#has_func() {
  95. let val = #ty::try_from(&mut pb.#take_func()).unwrap();
  96. o.#member=Some(val);
  97. }
  98. })
  99. },
  100. }
  101. }
  102. fn token_stream_for_field(
  103. ctxt: &Ctxt,
  104. member: &syn::Member,
  105. ty: &syn::Type,
  106. is_option: bool,
  107. ) -> Option<TokenStream> {
  108. let ident = get_member_ident(ctxt, member)?;
  109. let ty_info = parse_ty(ctxt, ty)?;
  110. match ident_category(ty_info.ident) {
  111. TypeCategory::Array => {
  112. assert_bracket_ty_is_some(ctxt, &ty_info);
  113. token_stream_for_vec(ctxt, &member, &ty_info.bracket_ty_info.unwrap())
  114. },
  115. TypeCategory::Map => {
  116. assert_bracket_ty_is_some(ctxt, &ty_info);
  117. token_stream_for_map(ctxt, &member, &ty_info.bracket_ty_info.unwrap())
  118. },
  119. TypeCategory::Protobuf => {
  120. // if the type wrapped by SingularPtrField, should call take first
  121. let take = syn::Ident::new("take", Span::call_site());
  122. // inner_type_ty would be the type of the field. (e.g value of AnyData)
  123. let ty = ty_info.ty;
  124. Some(quote! {
  125. let some_value = pb.#member.#take();
  126. if some_value.is_some() {
  127. let struct_de_from_pb = #ty::try_from(&mut some_value.unwrap()).unwrap();
  128. o.#member = struct_de_from_pb;
  129. }
  130. })
  131. },
  132. TypeCategory::Enum => {
  133. let ty = ty_info.ty;
  134. Some(quote! {
  135. let enum_de_from_pb = #ty::try_from(&pb.#member).unwrap();
  136. o.#member = enum_de_from_pb;
  137. })
  138. },
  139. TypeCategory::Str => {
  140. let take_ident =
  141. syn::Ident::new(&format!("take_{}", ident.to_string()), Span::call_site());
  142. if is_option {
  143. Some(quote! {
  144. if pb.#member.is_empty() {
  145. o.#member = None;
  146. } else {
  147. o.#member = Some(pb.#take_ident());
  148. }
  149. })
  150. } else {
  151. Some(quote! {
  152. o.#member = pb.#take_ident();
  153. })
  154. }
  155. },
  156. TypeCategory::Opt => {
  157. token_stream_for_field(ctxt, member, ty_info.bracket_ty_info.unwrap().ty, true)
  158. },
  159. TypeCategory::Primitive | TypeCategory::Bytes => {
  160. // eprintln!("😄 #{:?}", &field.name().unwrap());
  161. if is_option {
  162. Some(quote! { o.#member = Some(pb.#member.clone()); })
  163. } else {
  164. Some(quote! { o.#member = pb.#member.clone(); })
  165. }
  166. },
  167. }
  168. }
  169. fn token_stream_for_vec(
  170. ctxt: &Ctxt,
  171. member: &syn::Member,
  172. bracketed_type: &TyInfo,
  173. ) -> Option<TokenStream> {
  174. let ident = get_member_ident(ctxt, member)?;
  175. match ident_category(bracketed_type.ident) {
  176. TypeCategory::Protobuf => {
  177. let ty = bracketed_type.ty;
  178. // Deserialize from pb struct of type vec, should call take_xx(), get the
  179. // repeated_field and then calling the into_iter。
  180. let take_ident = format_ident!("take_{}", ident.to_string());
  181. Some(quote! {
  182. o.#member = pb.#take_ident()
  183. .into_iter()
  184. .map(|mut m| #ty::try_from(&mut m).unwrap())
  185. .collect();
  186. })
  187. },
  188. TypeCategory::Bytes => {
  189. // Vec<u8>
  190. Some(quote! {
  191. o.#member = pb.#member.clone();
  192. })
  193. },
  194. _ => {
  195. // String
  196. let take_ident = format_ident!("take_{}", ident.to_string());
  197. Some(quote! {
  198. o.#member = pb.#take_ident().into_vec();
  199. })
  200. },
  201. }
  202. }
  203. fn token_stream_for_map(
  204. ctxt: &Ctxt,
  205. member: &syn::Member,
  206. bracketed_type: &TyInfo,
  207. ) -> Option<TokenStream> {
  208. let ident = get_member_ident(ctxt, member)?;
  209. let take_ident = format_ident!("take_{}", ident.to_string());
  210. let ty = bracketed_type.ty;
  211. match ident_category(bracketed_type.ident) {
  212. TypeCategory::Protobuf => Some(quote! {
  213. let mut m: std::collections::HashMap<String, #ty> = std::collections::HashMap::new();
  214. pb.#take_ident().into_iter().for_each(|(k,mut v)| {
  215. m.insert(k.clone(), #ty::try_from(&mut v).unwrap());
  216. });
  217. o.#member = m;
  218. }),
  219. _ => Some(quote! {
  220. let mut m: std::collections::HashMap<String, #ty> = std::collections::HashMap::new();
  221. pb.#take_ident().into_iter().for_each(|(k,mut v)| {
  222. m.insert(k.clone(), v);
  223. });
  224. o.#member = m;
  225. }),
  226. }
  227. }