derive_meta.rs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. use crate::proto::crate_info::{CrateProtoInfo, FileProtoInfo};
  2. use crate::util::{get_tera, read_file};
  3. use std::fs::OpenOptions;
  4. use std::io::Write;
  5. use tera::Context;
  6. pub struct ProtobufDeriveMeta {
  7. context: Context,
  8. structs: Vec<String>,
  9. enums: Vec<String>,
  10. }
  11. #[allow(dead_code)]
  12. impl ProtobufDeriveMeta {
  13. pub fn new(structs: Vec<String>, enums: Vec<String>) -> Self {
  14. return ProtobufDeriveMeta {
  15. context: Context::new(),
  16. structs,
  17. enums,
  18. };
  19. }
  20. pub fn render(&mut self) -> Option<String> {
  21. self.context.insert("names", &self.structs);
  22. self.context.insert("enums", &self.enums);
  23. let tera = get_tera("derive_meta");
  24. match tera.render("derive_meta.tera", &self.context) {
  25. Ok(r) => Some(r),
  26. Err(e) => {
  27. log::error!("{:?}", e);
  28. None
  29. }
  30. }
  31. }
  32. }
  33. pub fn write_derive_meta(crate_infos: &Vec<CrateProtoInfo>, derive_meta_dir: &str) {
  34. let file_proto_infos = crate_infos
  35. .iter()
  36. .map(|ref crate_info| &crate_info.files)
  37. .flatten()
  38. .collect::<Vec<&FileProtoInfo>>();
  39. let structs: Vec<String> = file_proto_infos
  40. .iter()
  41. .map(|info| info.structs.clone())
  42. .flatten()
  43. .collect();
  44. let enums: Vec<String> = file_proto_infos
  45. .iter()
  46. .map(|info| info.enums.clone())
  47. .flatten()
  48. .collect();
  49. let mut derive_template = ProtobufDeriveMeta::new(structs, enums);
  50. let new_content = derive_template.render().unwrap();
  51. let old_content = read_file(derive_meta_dir).unwrap();
  52. if new_content.clone() == old_content {
  53. return;
  54. }
  55. // println!("{}", diff_lines(&old_content, &new_content));
  56. match OpenOptions::new()
  57. .create(true)
  58. .write(true)
  59. .append(false)
  60. .truncate(true)
  61. .open(derive_meta_dir)
  62. {
  63. Ok(ref mut file) => {
  64. file.write_all(new_content.as_bytes()).unwrap();
  65. }
  66. Err(err) => {
  67. panic!("Failed to open log file: {}", err);
  68. }
  69. }
  70. }