Skip to content

Commit 30ac7c9

Browse files
generate-copyright: Render Node with rinja too.
1 parent 37ab090 commit 30ac7c9

File tree

4 files changed

+115
-77
lines changed

4 files changed

+115
-77
lines changed

Cargo.lock

+42-4
Original file line numberDiff line numberDiff line change
@@ -1407,9 +1407,9 @@ version = "0.1.0"
14071407
dependencies = [
14081408
"anyhow",
14091409
"cargo_metadata 0.18.1",
1410+
"rinja 0.2.0",
14101411
"serde",
14111412
"serde_json",
1412-
"tempfile",
14131413
"thiserror",
14141414
]
14151415

@@ -3100,14 +3100,43 @@ dependencies = [
31003100
"walkdir",
31013101
]
31023102

3103+
[[package]]
3104+
name = "rinja"
3105+
version = "0.2.0"
3106+
source = "registry+https://github.com/rust-lang/crates.io-index"
3107+
checksum = "d2d47a46d7729e891c8accf260e9daa02ae6d570aa2a94fb1fb27eb5364a2323"
3108+
dependencies = [
3109+
"humansize",
3110+
"num-traits",
3111+
"percent-encoding",
3112+
"rinja_derive 0.2.0",
3113+
]
3114+
31033115
[[package]]
31043116
name = "rinja"
31053117
version = "0.3.0"
31063118
source = "registry+https://github.com/rust-lang/crates.io-index"
31073119
checksum = "6d3762e3740cdbf2fd2be465cc2c26d643ad17353cc2e0223d211c1b096118bd"
31083120
dependencies = [
31093121
"itoa",
3110-
"rinja_derive",
3122+
"rinja_derive 0.3.0",
3123+
]
3124+
3125+
[[package]]
3126+
name = "rinja_derive"
3127+
version = "0.2.0"
3128+
source = "registry+https://github.com/rust-lang/crates.io-index"
3129+
checksum = "44dae9afe59d58ed8d988d67d1945f3638125d2fd2104058399382e11bd3ea2a"
3130+
dependencies = [
3131+
"basic-toml",
3132+
"mime",
3133+
"mime_guess",
3134+
"once_map",
3135+
"proc-macro2",
3136+
"quote",
3137+
"rinja_parser 0.2.0",
3138+
"serde",
3139+
"syn 2.0.67",
31113140
]
31123141

31133142
[[package]]
@@ -3123,11 +3152,20 @@ dependencies = [
31233152
"once_map",
31243153
"proc-macro2",
31253154
"quote",
3126-
"rinja_parser",
3155+
"rinja_parser 0.3.0",
31273156
"serde",
31283157
"syn 2.0.67",
31293158
]
31303159

3160+
[[package]]
3161+
name = "rinja_parser"
3162+
version = "0.2.0"
3163+
source = "registry+https://github.com/rust-lang/crates.io-index"
3164+
checksum = "1b1771c78cd5d3b1646ef8d8f2ed100db936e8b291d3cc06e92a339ff346858c"
3165+
dependencies = [
3166+
"nom",
3167+
]
3168+
31313169
[[package]]
31323170
name = "rinja_parser"
31333171
version = "0.3.0"
@@ -4606,7 +4644,7 @@ dependencies = [
46064644
"minifier",
46074645
"pulldown-cmark 0.9.6",
46084646
"regex",
4609-
"rinja",
4647+
"rinja 0.3.0",
46104648
"rustdoc-json-types",
46114649
"serde",
46124650
"serde_json",

src/tools/generate-copyright/Cargo.toml

-2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ 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"
16-
tempfile = "3"
1715
thiserror = "1"

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

+2-71
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 {
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)