dart_event.rs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. use super::event_template::*;
  2. use crate::util::*;
  3. use flowy_ast::{event_ast::*, *};
  4. use syn::Item;
  5. use walkdir::WalkDir;
  6. pub struct DartEventCodeGen {
  7. pub rust_sources: Vec<String>,
  8. pub output_dir: String,
  9. }
  10. impl DartEventCodeGen {
  11. pub fn gen(&self) {
  12. let event_crates = parse_dart_event_files(self.rust_sources.clone());
  13. let event_ast = event_crates
  14. .iter()
  15. .map(parse_event_crate)
  16. .flatten()
  17. .collect::<Vec<_>>();
  18. let event_render_ctx = ast_to_event_render_ctx(event_ast.as_ref());
  19. let mut render_result = String::new();
  20. for (index, render_ctx) in event_render_ctx.into_iter().enumerate() {
  21. let mut event_template = EventTemplate::new();
  22. if let Some(content) = event_template.render(render_ctx, index) {
  23. render_result.push_str(content.as_ref())
  24. }
  25. }
  26. save_content_to_file_with_diff_prompt(
  27. render_result.as_ref(),
  28. self.output_dir.as_str(),
  29. true,
  30. );
  31. }
  32. }
  33. pub struct DartEventCrate {
  34. crate_path: String,
  35. #[allow(dead_code)]
  36. crate_name: String,
  37. event_files: Vec<String>,
  38. }
  39. impl DartEventCrate {
  40. pub fn from_config(config: &CrateConfig) -> Self {
  41. DartEventCrate {
  42. crate_path: config.crate_path.clone(),
  43. crate_name: config.folder_name.clone(),
  44. event_files: config.flowy_config.event_files.clone(),
  45. }
  46. }
  47. }
  48. pub fn parse_dart_event_files(roots: Vec<String>) -> Vec<DartEventCrate> {
  49. let mut dart_event_crates: Vec<DartEventCrate> = vec![];
  50. roots.iter().for_each(|root| {
  51. let crates = WalkDir::new(root)
  52. .into_iter()
  53. .filter_entry(|e| !is_hidden(e))
  54. .filter_map(|e| e.ok())
  55. .filter(is_crate_dir)
  56. .flat_map(|e| parse_crate_config_from(&e))
  57. .map(|crate_config| DartEventCrate::from_config(&crate_config))
  58. .collect::<Vec<DartEventCrate>>();
  59. dart_event_crates.extend(crates);
  60. });
  61. dart_event_crates
  62. }
  63. pub fn parse_event_crate(event_crate: &DartEventCrate) -> Vec<EventASTContext> {
  64. event_crate
  65. .event_files
  66. .iter()
  67. .map(|event_file| {
  68. let file_path = format!("{}/{}", event_crate.crate_path, event_file);
  69. let file_content = read_file(file_path.as_ref()).unwrap();
  70. let ast = syn::parse_file(file_content.as_ref()).expect("Unable to parse file");
  71. ast.items
  72. .iter()
  73. .map(|item| match item {
  74. Item::Enum(item_enum) => {
  75. let ctxt = Ctxt::new();
  76. let attrs = flowy_ast::enum_from_ast(
  77. &ctxt,
  78. &item_enum.ident,
  79. &item_enum.variants,
  80. &item_enum.attrs,
  81. );
  82. ctxt.check().unwrap();
  83. attrs
  84. .iter()
  85. .filter(|attr| !attr.attrs.event_attrs.ignore)
  86. .enumerate()
  87. .map(|(_index, attr)| EventASTContext::from(&attr.attrs))
  88. .collect::<Vec<_>>()
  89. }
  90. _ => vec![],
  91. })
  92. .flatten()
  93. .collect::<Vec<_>>()
  94. })
  95. .flatten()
  96. .collect::<Vec<EventASTContext>>()
  97. }
  98. pub fn ast_to_event_render_ctx(ast: &[EventASTContext]) -> Vec<EventRenderContext> {
  99. ast.iter()
  100. .map(|event_ast| {
  101. let input_deserializer = event_ast
  102. .event_input
  103. .as_ref()
  104. .map(|event_input| event_input.get_ident().unwrap().to_string());
  105. let output_deserializer = event_ast
  106. .event_output
  107. .as_ref()
  108. .map(|event_output| event_output.get_ident().unwrap().to_string());
  109. // eprintln!(
  110. // "😁 {:?} / {:?}",
  111. // event_ast.event_input, event_ast.event_output
  112. // );
  113. EventRenderContext {
  114. input_deserializer,
  115. output_deserializer,
  116. error_deserializer: event_ast.event_error.clone(),
  117. event: event_ast.event.to_string(),
  118. event_ty: event_ast.event_ty.to_string(),
  119. }
  120. })
  121. .collect::<Vec<EventRenderContext>>()
  122. }