Skip to content

Commit f01dd60

Browse files
generate-copyright: Render Node with rinja too.
1 parent 041e4ba commit f01dd60

File tree

4 files changed

+77
-72
lines changed

4 files changed

+77
-72
lines changed

Cargo.lock

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,6 +1478,7 @@ version = "0.1.0"
14781478
dependencies = [
14791479
"anyhow",
14801480
"cargo_metadata 0.18.1",
1481+
"rinja",
14811482
"serde",
14821483
"serde_json",
14831484
"tempfile",
@@ -3298,6 +3299,9 @@ version = "0.2.0"
32983299
source = "registry+https://github.com/rust-lang/crates.io-index"
32993300
checksum = "d2d47a46d7729e891c8accf260e9daa02ae6d570aa2a94fb1fb27eb5364a2323"
33003301
dependencies = [
3302+
"humansize",
3303+
"num-traits",
3304+
"percent-encoding",
33013305
"rinja_derive",
33023306
]
33033307

src/tools/generate-copyright/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ description = "Produces a manifest of all the copyrighted materials in the Rust
99
[dependencies]
1010
anyhow = "1.0.65"
1111
cargo_metadata = "0.18.1"
12-
html-escape = "0.2.13"
1312
rinja = "0.2.0"
1413
serde = { version = "1.0.147", features = ["derive"] }
1514
serde_json = "1.0.85"

src/tools/generate-copyright/src/main.rs

Lines changed: 2 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -62,85 +62,16 @@ struct Metadata {
6262
}
6363

6464
/// Describes one node in our metadata tree
65-
#[derive(serde::Deserialize)]
65+
#[derive(serde::Deserialize, rinja::Template)]
6666
#[serde(rename_all = "kebab-case", tag = "type")]
67+
#[template(path = "Node.html")]
6768
pub(crate) enum Node {
6869
Root { children: Vec<Node> },
6970
Directory { name: String, children: Vec<Node>, license: Option<License> },
7071
File { name: String, license: License },
7172
Group { files: Vec<String>, directories: Vec<String>, license: License },
7273
}
7374

74-
fn with_box<F>(fmt: &mut std::fmt::Formatter<'_>, inner: F) -> std::fmt::Result
75-
where
76-
F: FnOnce(&mut std::fmt::Formatter<'_>) -> std::fmt::Result,
77-
{
78-
writeln!(fmt, r#"<div style="border:1px solid black; padding: 5px;">"#)?;
79-
inner(fmt)?;
80-
writeln!(fmt, "</div>")?;
81-
Ok(())
82-
}
83-
84-
impl std::fmt::Display for Node {
85-
fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
86-
match self {
87-
Node::Root { children } => {
88-
if children.len() > 1 {
89-
with_box(fmt, |f| {
90-
for child in children {
91-
writeln!(f, "{child}")?;
92-
}
93-
Ok(())
94-
})
95-
} else {
96-
for child in children {
97-
writeln!(fmt, "{child}")?;
98-
}
99-
Ok(())
100-
}
101-
}
102-
Node::Directory { name, children, license } => with_box(fmt, |f| {
103-
render_tree_license(std::iter::once(name), license.as_ref(), f)?;
104-
if !children.is_empty() {
105-
writeln!(f, "<p><b>Exceptions:</b></p>")?;
106-
for child in children {
107-
writeln!(f, "{child}")?;
108-
}
109-
}
110-
Ok(())
111-
}),
112-
Node::Group { files, directories, license } => with_box(fmt, |f| {
113-
render_tree_license(directories.iter().chain(files.iter()), Some(license), f)
114-
}),
115-
Node::File { name, license } => {
116-
with_box(fmt, |f| render_tree_license(std::iter::once(name), Some(license), f))
117-
}
118-
}
119-
}
120-
}
121-
122-
/// Draw a series of sibling files/folders, as HTML, into the given formatter.
123-
fn render_tree_license<'a>(
124-
names: impl Iterator<Item = &'a String>,
125-
license: Option<&License>,
126-
f: &mut std::fmt::Formatter<'_>,
127-
) -> std::fmt::Result {
128-
writeln!(f, "<p><b>File/Directory:</b> ")?;
129-
for name in names {
130-
writeln!(f, "<code>{}</code>", html_escape::encode_text(&name))?;
131-
}
132-
writeln!(f, "</p>")?;
133-
134-
if let Some(license) = license {
135-
writeln!(f, "<p><b>License:</b> {}</p>", html_escape::encode_text(&license.spdx))?;
136-
for copyright in license.copyright.iter() {
137-
writeln!(f, "<p><b>Copyright:</b> {}</p>", html_escape::encode_text(&copyright))?;
138-
}
139-
}
140-
141-
Ok(())
142-
}
143-
14475
/// A License has an SPDX license name and a list of copyright holders.
14576
#[derive(serde::Deserialize)]
14677
struct License {
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
{% match self %}
2+
3+
{% when Node::Root { children } %}
4+
5+
{% for child in children %}
6+
{{ child|safe }}
7+
{% endfor %}
8+
9+
{% when Node::Directory { name, children, license } %}
10+
11+
<div style="border:1px solid black; padding: 5px;">
12+
13+
<p>
14+
<b>File/Directory:</b> <code>{{ name }}</code>
15+
</p>
16+
17+
{% if let Some(license) = license %}
18+
19+
<p><b>License:</b> {{ license.spdx }}</p>
20+
{% for copyright in license.copyright.iter() %}
21+
<p><b>Copyright:</b> {{ copyright }}</p>
22+
{% endfor %}
23+
24+
{% endif %}
25+
26+
{% if !children.is_empty() %}
27+
28+
<p><b>Exceptions:</b></p>
29+
{% for child in children %}
30+
{{ child|safe }}
31+
{% endfor %}
32+
33+
{% endif %}
34+
35+
</div>
36+
37+
{% when Node::File { name, license } %}
38+
39+
<div style="border:1px solid black; padding: 5px;">
40+
<p>
41+
<b>File/Directory:</b> <code>{{ name }}</code>
42+
</p>
43+
44+
<p><b>License:</b> {{ license.spdx }}</p>
45+
{% for copyright in license.copyright.iter() %}
46+
<p><b>Copyright:</b> {{ copyright }}</p>
47+
{% endfor %}
48+
</div>
49+
50+
{% when Node::Group { files, directories, license } %}
51+
52+
<div style="border:1px solid black; padding: 5px;">
53+
54+
<p>
55+
<b>File/Directory:</b>
56+
{% for name in files %}
57+
<code>{{ name }}</code>
58+
{% endfor %}
59+
{% for name in directories %}
60+
<code>{{ name }}</code>
61+
{% endfor %}
62+
</p>
63+
64+
<p><b>License:</b> {{ license.spdx }}</p>
65+
{% for copyright in license.copyright.iter() %}
66+
<p><b>Copyright:</b> {{ copyright }}</p>
67+
{% endfor %}
68+
69+
</div>
70+
71+
{% endmatch %}

0 commit comments

Comments
 (0)