mod.rs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. mod deserialize;
  2. mod enum_serde;
  3. mod serialize;
  4. mod util;
  5. use crate::proto_buf::{deserialize::make_de_token_steam, enum_serde::make_enum_token_stream, serialize::make_se_token_stream};
  6. use flowy_ast::*;
  7. use proc_macro2::TokenStream;
  8. pub fn expand_derive(input: &syn::DeriveInput) -> Result<TokenStream, Vec<syn::Error>> {
  9. let ctxt = Ctxt::new();
  10. let cont = match ASTContainer::from_ast(&ctxt, input) {
  11. Some(cont) => cont,
  12. None => return Err(ctxt.check().unwrap_err()),
  13. };
  14. let mut token_stream: TokenStream = TokenStream::default();
  15. let de_token_stream = make_de_token_steam(&ctxt, &cont);
  16. if de_token_stream.is_some() {
  17. token_stream.extend(de_token_stream.unwrap());
  18. }
  19. let se_token_stream = make_se_token_stream(&ctxt, &cont);
  20. if se_token_stream.is_some() {
  21. token_stream.extend(se_token_stream.unwrap());
  22. }
  23. ctxt.check()?;
  24. Ok(token_stream)
  25. }
  26. pub fn expand_enum_derive(input: &syn::DeriveInput) -> Result<TokenStream, Vec<syn::Error>> {
  27. let ctxt = Ctxt::new();
  28. let cont = match ASTContainer::from_ast(&ctxt, input) {
  29. Some(cont) => cont,
  30. None => return Err(ctxt.check().unwrap_err()),
  31. };
  32. let mut token_stream: TokenStream = TokenStream::default();
  33. let enum_token_stream = make_enum_token_stream(&ctxt, &cont);
  34. if enum_token_stream.is_some() {
  35. token_stream.extend(enum_token_stream.unwrap());
  36. }
  37. ctxt.check()?;
  38. Ok(token_stream)
  39. }
  40. // #[macro_use]
  41. // macro_rules! impl_try_for_primitive_type {
  42. // ($target:ident) => {
  43. // impl std::convert::TryFrom<&$target> for $target {
  44. // type Error = String;
  45. // fn try_from(val: &$target) -> Result<Self, Self::Error> {
  46. // Ok(val.clone()) } }
  47. //
  48. // impl std::convert::TryInto<$target> for $target {
  49. // type Error = String;
  50. //
  51. // fn try_into(self) -> Result<Self, Self::Error> { Ok(self) }
  52. // }
  53. // };
  54. // }
  55. //
  56. // impl_try_for_primitive_type!(String);
  57. // impl_try_for_primitive_type!(i64);
  58. // impl_try_for_primitive_type!(i32);
  59. // impl_try_for_primitive_type!(i16);
  60. // impl_try_for_primitive_type!(u64);
  61. // impl_try_for_primitive_type!(u32);
  62. // impl_try_for_primitive_type!(u16);
  63. // impl_try_for_primitive_type!(bool);
  64. // impl_try_for_primitive_type!(f64);
  65. // impl_try_for_primitive_type!(f32);