85 lines
2.6 KiB
Rust
85 lines
2.6 KiB
Rust
use crate::Buffer;
|
|
use dioxus_rsx::*;
|
|
use quote::ToTokens;
|
|
use std::fmt::{self, Result, Write};
|
|
|
|
impl Buffer {
|
|
pub fn write_component(
|
|
&mut self,
|
|
Component {
|
|
name,
|
|
body,
|
|
children,
|
|
manual_props,
|
|
prop_gen_args,
|
|
}: &Component,
|
|
) -> Result {
|
|
let mut name = name.to_token_stream().to_string();
|
|
name.retain(|c| !c.is_whitespace());
|
|
self.tab()?;
|
|
write!(self.buf, "{name}")?;
|
|
|
|
if let Some(generics) = prop_gen_args {
|
|
let mut written = generics.to_token_stream().to_string();
|
|
written.retain(|c| !c.is_whitespace());
|
|
write!(self.buf, "{}", written)?;
|
|
}
|
|
|
|
write!(self.buf, " {{")?;
|
|
|
|
if !body.is_empty() || !children.is_empty() {
|
|
self.new_line()?;
|
|
}
|
|
|
|
for field in body {
|
|
self.indented_tab()?;
|
|
let name = &field.name;
|
|
match &field.content {
|
|
ContentField::ManExpr(exp) => {
|
|
let out = prettyplease::unparse_expr(exp);
|
|
writeln!(self.buf, "{}: {},", name, out)?;
|
|
}
|
|
ContentField::Formatted(s) => {
|
|
writeln!(self.buf, "{}: \"{}\",", name, s.value())?;
|
|
}
|
|
ContentField::OnHandlerRaw(exp) => {
|
|
let out = prettyplease::unparse_expr(exp);
|
|
let mut lines = out.split('\n').peekable();
|
|
let first = lines.next().unwrap();
|
|
write!(self.buf, "{}: {}", name, first)?;
|
|
for line in lines {
|
|
self.new_line()?;
|
|
self.indented_tab()?;
|
|
write!(self.buf, "{}", line)?;
|
|
}
|
|
writeln!(self.buf, ",")?;
|
|
}
|
|
}
|
|
}
|
|
|
|
if let Some(exp) = manual_props {
|
|
self.indented_tab()?;
|
|
let out = prettyplease::unparse_expr(exp);
|
|
let mut lines = out.split('\n').peekable();
|
|
let first = lines.next().unwrap();
|
|
write!(self.buf, "..{}", first)?;
|
|
for line in lines {
|
|
self.new_line()?;
|
|
self.indented_tab()?;
|
|
write!(self.buf, "{}", line)?;
|
|
}
|
|
self.new_line()?;
|
|
}
|
|
|
|
for child in children {
|
|
self.write_indented_ident(child)?;
|
|
}
|
|
|
|
if !body.is_empty() || !children.is_empty() {
|
|
self.tab()?;
|
|
}
|
|
writeln!(self.buf, "}}")?;
|
|
Ok(())
|
|
}
|
|
}
|