1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
pub trait Renderable { fn render_summary( &self, stream: &mut dyn std::io::Write, ) -> Result<(), Box<dyn std::error::Error>>; fn render(&self, stream: &mut dyn std::io::Write) -> Result<(), Box<dyn std::error::Error>>; } impl Renderable for dyn liquid_core::FilterReflection { fn render_summary( &self, stream: &mut dyn std::io::Write, ) -> Result<(), Box<dyn std::error::Error>> { writeln!(stream, "**{}**: {}", self.name(), self.description())?; Ok(()) } fn render(&self, stream: &mut dyn std::io::Write) -> Result<(), Box<dyn std::error::Error>> { writeln!(stream, "**{}**: {}", self.name(), self.description())?; writeln!(stream)?; let params = self.positional_parameters(); if !params.is_empty() { writeln!(stream, "Parameters (positional):")?; writeln!(stream, "| Name | Description | Required? |")?; writeln!(stream, "|------|-------------|-----------|")?; for param in params { writeln!( stream, "| {} | {} | {} |", param.name, param.description, if param.is_optional { "no" } else { "yes" } )?; } writeln!(stream)?; } let params = self.keyword_parameters(); if !params.is_empty() { writeln!(stream, "Parameters (named):")?; writeln!(stream, "| Name | Description | Required? |")?; writeln!(stream, "|------|-------------|-----------|")?; for param in params { writeln!( stream, "| {} | {} | {} |", param.name, param.description, if param.is_optional { "no" } else { "yes" } )?; } writeln!(stream)?; } Ok(()) } } impl Renderable for dyn liquid_core::TagReflection { fn render_summary( &self, stream: &mut dyn std::io::Write, ) -> Result<(), Box<dyn std::error::Error>> { writeln!(stream, "**{}**: {}", self.tag(), self.description())?; Ok(()) } fn render(&self, stream: &mut dyn std::io::Write) -> Result<(), Box<dyn std::error::Error>> { writeln!(stream, "**{}**: {}", self.tag(), self.description())?; writeln!(stream)?; if let Some(spec) = self.spec() { writeln!(stream, "Grammar: `{}`", spec)?; writeln!(stream)?; } if let Some(example) = self.example() { writeln!(stream, "Example:")?; writeln!(stream, "```liquid")?; writeln!(stream, "{}", example)?; writeln!(stream, "```")?; } Ok(()) } } impl Renderable for dyn liquid_core::BlockReflection { fn render_summary( &self, stream: &mut dyn std::io::Write, ) -> Result<(), Box<dyn std::error::Error>> { writeln!(stream, "**{}**: {}", self.start_tag(), self.description())?; Ok(()) } fn render(&self, stream: &mut dyn std::io::Write) -> Result<(), Box<dyn std::error::Error>> { writeln!(stream, "**{}**: {}", self.start_tag(), self.description())?; writeln!(stream)?; if let Some(spec) = self.spec() { writeln!(stream, "Grammar: `{}`", spec)?; writeln!(stream)?; } if let Some(example) = self.example() { writeln!(stream, "Example:")?; writeln!(stream, "```liquid")?; writeln!(stream, "{}", example)?; writeln!(stream, "```")?; } Ok(()) } }