event_template.rs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. use crate::util::get_tera;
  2. use tera::Context;
  3. pub struct EventTemplate {
  4. tera_context: Context,
  5. }
  6. pub const DART_IMPORTED: &str = r#"
  7. /// Auto gen code from rust ast, do not edit
  8. part of 'dispatch.dart';
  9. "#;
  10. pub struct EventRenderContext {
  11. pub input_deserializer: Option<String>,
  12. pub output_deserializer: Option<String>,
  13. pub error_deserializer: String,
  14. pub event: String,
  15. pub event_ty: String,
  16. }
  17. #[allow(dead_code)]
  18. impl EventTemplate {
  19. pub fn new() -> Self {
  20. EventTemplate {
  21. tera_context: Context::new(),
  22. }
  23. }
  24. pub fn render(&mut self, ctx: EventRenderContext, index: usize) -> Option<String> {
  25. if index == 0 {
  26. self.tera_context
  27. .insert("imported_dart_files", DART_IMPORTED)
  28. }
  29. self.tera_context.insert("index", &index);
  30. let dart_class_name = format!("{}{}", ctx.event_ty, ctx.event);
  31. let event = format!("{}.{}", ctx.event_ty, ctx.event);
  32. self.tera_context.insert("event_class", &dart_class_name);
  33. self.tera_context.insert("event", &event);
  34. self.tera_context
  35. .insert("has_input", &ctx.input_deserializer.is_some());
  36. match ctx.input_deserializer {
  37. None => self.tera_context.insert("input_deserializer", "Unit"),
  38. Some(ref input) => self.tera_context.insert("input_deserializer", input),
  39. }
  40. // eprintln!(
  41. // "😁 {:?} / {:?}",
  42. // &ctx.input_deserializer, &ctx.output_deserializer
  43. // );
  44. let has_output = ctx.output_deserializer.is_some();
  45. self.tera_context.insert("has_output", &has_output);
  46. match ctx.output_deserializer {
  47. None => self.tera_context.insert("output_deserializer", "Unit"),
  48. Some(ref output) => self.tera_context.insert("output_deserializer", output),
  49. }
  50. self.tera_context
  51. .insert("error_deserializer", &ctx.error_deserializer);
  52. let tera = get_tera("dart_event");
  53. match tera.render("event_template.tera", &self.tera_context) {
  54. Ok(r) => Some(r),
  55. Err(e) => {
  56. log::error!("{:?}", e);
  57. None
  58. }
  59. }
  60. }
  61. }