enum_serde.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. use flowy_ast::*;
  2. use proc_macro2::TokenStream;
  3. #[allow(dead_code)]
  4. pub fn make_enum_token_stream(_ctxt: &Ctxt, cont: &ASTContainer) -> Option<TokenStream> {
  5. let enum_ident = &cont.ident;
  6. let pb_enum = cont.attrs.pb_enum_type()?;
  7. let build_to_pb_enum = cont.data.all_idents().map(|i| {
  8. let token_stream: TokenStream = quote! {
  9. #enum_ident::#i => crate::protobuf::#pb_enum::#i,
  10. };
  11. token_stream
  12. });
  13. let build_from_pb_enum = cont.data.all_idents().map(|i| {
  14. let token_stream: TokenStream = quote! {
  15. crate::protobuf::#pb_enum::#i => #enum_ident::#i,
  16. };
  17. token_stream
  18. });
  19. Some(quote! {
  20. impl std::convert::TryFrom<&crate::protobuf::#pb_enum> for #enum_ident {
  21. type Error = String;
  22. fn try_from(pb:&crate::protobuf::#pb_enum) -> Result<Self, Self::Error> {
  23. Ok(match pb {
  24. #(#build_from_pb_enum)*
  25. })
  26. }
  27. }
  28. impl std::convert::TryInto<crate::protobuf::#pb_enum> for #enum_ident {
  29. type Error = String;
  30. fn try_into(self) -> Result<crate::protobuf::#pb_enum, Self::Error> {
  31. Ok(match self {
  32. #(#build_to_pb_enum)*
  33. })
  34. }
  35. }
  36. })
  37. }