~repos /tide-jsx

#rust#proc-macro#jsx

git clone https://pyrossh.dev/repos/tide-jsx.git

Tide + JSX



file:

src/simple_element.rs



use crate::html_escaping::escape_html;
use crate::Render;
use std::borrow::Cow;
use std::collections::HashMap;
use std::fmt::{Result, Write};
type Attributes<'a> = Option<HashMap<&'a str, Cow<'a, str>>>;
/// Simple HTML element tag
#[derive(Debug)]
pub struct SimpleElement<'a, T: Render> {
/// the HTML tag name, like `html`, `head`, `body`, `link`...
pub tag_name: &'a str,
pub attributes: Attributes<'a>,
pub contents: Option<T>,
}
fn write_attributes<'a, W: Write>(maybe_attributes: Attributes<'a>, writer: &mut W) -> Result {
match maybe_attributes {
None => Ok(()),
Some(mut attributes) => {
for (key, value) in attributes.drain() {
write!(writer, " {}=\"", key)?;
escape_html(&value, writer)?;
write!(writer, "\"")?;
}
Ok(())
}
}
}
impl<T: Render> Render for SimpleElement<'_, T> {
fn render_into<W: Write>(self, writer: &mut W) -> Result {
match self.contents {
None => {
write!(writer, "<{}", self.tag_name)?;
write_attributes(self.attributes, writer)?;
write!(writer, "/>")
}
Some(renderable) => {
write!(writer, "<{}", self.tag_name)?;
write_attributes(self.attributes, writer)?;
write!(writer, ">")?;
renderable.render_into(writer)?;
write!(writer, "</{}>", self.tag_name)
}
}
}
}