enum_serde.rs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  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::From<&crate::protobuf::#pb_enum> for #enum_ident {
  21. fn from(pb:&crate::protobuf::#pb_enum) -> Self {
  22. match pb {
  23. #(#build_from_pb_enum)*
  24. }
  25. }
  26. }
  27. impl std::convert::From<#enum_ident> for crate::protobuf::#pb_enum{
  28. fn from(o: #enum_ident) -> crate::protobuf::#pb_enum {
  29. match o {
  30. #(#build_to_pb_enum)*
  31. }
  32. }
  33. }
  34. })
  35. }