Files
dioxus/packages/autofmt/src/component.rs
T

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(())
}
}