#[macro_export]
macro_rules! build_svg {
($data:expr) => {{
let data = $data;
let mut svg = String::from("<svg xmlns=\"http://www.w3.org/2000/svg\"");
if let Some(vb) = data.view_box {
svg.push_str(" viewBox=\"");
svg.push_str(vb);
svg.push_str("\"");
}
if let Some(w) = data.width {
svg.push_str(" width=\"");
svg.push_str(w);
svg.push_str("\"");
}
if let Some(h) = data.height {
svg.push_str(" height=\"");
svg.push_str(h);
svg.push_str("\"");
}
svg.push_str(">");
if let Some(path_d) = data.path {
svg.push_str("<path d=\"");
svg.push_str(path_d);
svg.push_str("\" fill=\"currentColor\" />");
}
for path in data.paths {
svg.push_str("<path");
if let Some(d) = path.d {
svg.push_str(" d=\"");
svg.push_str(d);
svg.push_str("\"");
}
if let Some(fill) = path.fill {
svg.push_str(" fill=\"");
svg.push_str(fill);
svg.push_str("\"");
} else {
svg.push_str(" fill=\"currentColor\"");
}
if let Some(stroke) = path.stroke {
svg.push_str(" stroke=\"");
svg.push_str(stroke);
svg.push_str("\"");
}
if let Some(stroke_width) = path.stroke_width {
svg.push_str(" stroke-width=\"");
svg.push_str(stroke_width);
svg.push_str("\"");
}
if let Some(stroke_linecap) = path.stroke_linecap {
svg.push_str(" stroke-linecap=\"");
svg.push_str(stroke_linecap);
svg.push_str("\"");
}
if let Some(stroke_linejoin) = path.stroke_linejoin {
svg.push_str(" stroke-linejoin=\"");
svg.push_str(stroke_linejoin);
svg.push_str("\"");
}
if let Some(transform) = path.transform {
svg.push_str(" transform=\"");
svg.push_str(transform);
svg.push_str("\"");
}
svg.push_str(" />");
}
for elem in data.elements {
svg.push_str("<");
svg.push_str(elem.tag);
for (key, value) in elem.attributes {
svg.push_str(" ");
svg.push_str(key);
svg.push_str("=\"");
svg.push_str(value);
svg.push_str("\"");
}
svg.push_str(" />");
}
svg.push_str("</svg>");
svg
}};
}
#[macro_export]
macro_rules! build_svg_with_attrs {
($data:expr, $attrs:expr) => {{
let data = $data;
let attrs = $attrs;
let mut svg = String::from("<svg xmlns=\"http://www.w3.org/2000/svg\"");
if let Some(vb) = data.view_box {
svg.push_str(" viewBox=\"");
svg.push_str(vb);
svg.push_str("\"");
}
if let Some(w) = data.width {
svg.push_str(" width=\"");
svg.push_str(w);
svg.push_str("\"");
}
if let Some(h) = data.height {
svg.push_str(" height=\"");
svg.push_str(h);
svg.push_str("\"");
}
for (key, value) in attrs {
svg.push_str(" ");
svg.push_str(key);
svg.push_str("=\"");
svg.push_str(value);
svg.push_str("\"");
}
svg.push_str(">");
if let Some(path_d) = data.path {
svg.push_str("<path d=\"");
svg.push_str(path_d);
svg.push_str("\" fill=\"currentColor\" />");
}
for path in data.paths {
svg.push_str("<path");
if let Some(d) = path.d {
svg.push_str(" d=\"");
svg.push_str(d);
svg.push_str("\"");
}
if let Some(fill) = path.fill {
svg.push_str(" fill=\"");
svg.push_str(fill);
svg.push_str("\"");
} else {
svg.push_str(" fill=\"currentColor\"");
}
if let Some(stroke) = path.stroke {
svg.push_str(" stroke=\"");
svg.push_str(stroke);
svg.push_str("\"");
}
if let Some(stroke_width) = path.stroke_width {
svg.push_str(" stroke-width=\"");
svg.push_str(stroke_width);
svg.push_str("\"");
}
if let Some(stroke_linecap) = path.stroke_linecap {
svg.push_str(" stroke-linecap=\"");
svg.push_str(stroke_linecap);
svg.push_str("\"");
}
if let Some(stroke_linejoin) = path.stroke_linejoin {
svg.push_str(" stroke-linejoin=\"");
svg.push_str(stroke_linejoin);
svg.push_str("\"");
}
if let Some(transform) = path.transform {
svg.push_str(" transform=\"");
svg.push_str(transform);
svg.push_str("\"");
}
svg.push_str(" />");
}
for elem in data.elements {
svg.push_str("<");
svg.push_str(elem.tag);
for (key, value) in elem.attributes {
svg.push_str(" ");
svg.push_str(key);
svg.push_str("=\"");
svg.push_str(value);
svg.push_str("\"");
}
svg.push_str(" />");
}
svg.push_str("</svg>");
svg
}};
}