Skip to content

Commit c29aa2b

Browse files
authored
Refactored metadata.rs (#687)
1 parent 589a0b0 commit c29aa2b

File tree

1 file changed

+58
-26
lines changed

1 file changed

+58
-26
lines changed

src/docbuilder/metadata.rs

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::error::Result;
22
use failure::err_msg;
33
use std::collections::HashSet;
44
use std::path::Path;
5-
use toml::Value;
5+
use toml::{map::Map, Value};
66

77
/// Metadata for custom builds
88
///
@@ -83,21 +83,25 @@ impl Metadata {
8383
return Ok(Metadata::from_manifest(manifest_path));
8484
}
8585
}
86+
8687
Err(err_msg("Manifest not found"))
8788
}
8889

8990
fn from_manifest<P: AsRef<Path>>(path: P) -> Metadata {
90-
use std::fs::File;
91-
use std::io::Read;
92-
let mut f = match File::open(path) {
93-
Ok(f) => f,
94-
Err(_) => return Metadata::default(),
91+
use std::{fs::File, io::Read};
92+
93+
let mut file = if let Ok(file) = File::open(path) {
94+
file
95+
} else {
96+
return Metadata::default();
9597
};
96-
let mut s = String::new();
97-
if f.read_to_string(&mut s).is_err() {
98+
99+
let mut meta = String::new();
100+
if file.read_to_string(&mut meta).is_err() {
98101
return Metadata::default();
99102
}
100-
Metadata::from_str(&s)
103+
104+
Metadata::from_str(&meta)
101105
}
102106

103107
// This is similar to Default trait but it's private
@@ -116,53 +120,67 @@ impl Metadata {
116120
fn from_str(manifest: &str) -> Metadata {
117121
let mut metadata = Metadata::default();
118122

119-
let manifest = match manifest.parse::<Value>() {
120-
Ok(m) => m,
121-
Err(_) => return metadata,
123+
let manifest = if let Ok(manifest) = manifest.parse::<Value>() {
124+
manifest
125+
} else {
126+
return metadata;
122127
};
123128

124-
if let Some(table) = manifest
125-
.get("package")
126-
.and_then(|p| p.as_table())
127-
.and_then(|p| p.get("metadata"))
128-
.and_then(|p| p.as_table())
129-
.and_then(|p| p.get("docs"))
130-
.and_then(|p| p.as_table())
131-
.and_then(|p| p.get("rs"))
132-
.and_then(|p| p.as_table())
133-
{
129+
fn fetch_manifest_tables<'a>(manifest: &'a Value) -> Option<&'a Map<String, Value>> {
130+
manifest
131+
.get("package")?
132+
.as_table()?
133+
.get("metadata")?
134+
.as_table()?
135+
.get("docs")?
136+
.as_table()?
137+
.get("rs")?
138+
.as_table()
139+
}
140+
141+
if let Some(table) = fetch_manifest_tables(&manifest) {
142+
let collect_into_array =
143+
|f: &Vec<Value>| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect();
144+
134145
metadata.features = table
135146
.get("features")
136147
.and_then(|f| f.as_array())
137-
.and_then(|f| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect());
148+
.and_then(collect_into_array);
149+
138150
metadata.no_default_features = table
139151
.get("no-default-features")
140152
.and_then(|v| v.as_bool())
141153
.unwrap_or(metadata.no_default_features);
154+
142155
metadata.all_features = table
143156
.get("all-features")
144157
.and_then(|v| v.as_bool())
145158
.unwrap_or(metadata.all_features);
159+
146160
metadata.default_target = table
147161
.get("default-target")
148162
.and_then(|v| v.as_str())
149163
.map(|v| v.to_owned());
164+
150165
metadata.targets = table
151166
.get("targets")
152167
.and_then(|f| f.as_array())
153-
.and_then(|f| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect());
168+
.and_then(collect_into_array);
169+
154170
metadata.rustc_args = table
155171
.get("rustc-args")
156172
.and_then(|f| f.as_array())
157-
.and_then(|f| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect());
173+
.and_then(collect_into_array);
174+
158175
metadata.rustdoc_args = table
159176
.get("rustdoc-args")
160177
.and_then(|f| f.as_array())
161-
.and_then(|f| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect());
178+
.and_then(collect_into_array);
162179
}
163180

164181
metadata
165182
}
183+
166184
pub(super) fn targets(&self) -> BuildTargets<'_> {
167185
use super::rustwide_builder::{HOST_TARGET, TARGETS};
168186

@@ -282,16 +300,19 @@ mod test {
282300
use crate::docbuilder::rustwide_builder::{HOST_TARGET, TARGETS};
283301

284302
let mut metadata = Metadata::default();
303+
285304
// unchanged default_target, targets not specified
286305
let BuildTargets {
287306
default_target: default,
288307
other_targets: tier_one,
289308
} = metadata.targets();
290309
assert_eq!(default, HOST_TARGET);
310+
291311
// should be equal to TARGETS \ {HOST_TARGET}
292312
for actual in &tier_one {
293313
assert!(TARGETS.contains(actual));
294314
}
315+
295316
for expected in TARGETS {
296317
if *expected == HOST_TARGET {
297318
assert!(!tier_one.contains(&HOST_TARGET));
@@ -302,10 +323,12 @@ mod test {
302323

303324
// unchanged default_target, targets specified to be empty
304325
metadata.targets = Some(Vec::new());
326+
305327
let BuildTargets {
306328
default_target: default,
307329
other_targets: others,
308330
} = metadata.targets();
331+
309332
assert_eq!(default, HOST_TARGET);
310333
assert!(others.is_empty());
311334

@@ -314,10 +337,12 @@ mod test {
314337
"i686-pc-windows-msvc".into(),
315338
"i686-apple-darwin".into(),
316339
]);
340+
317341
let BuildTargets {
318342
default_target: default,
319343
other_targets: others,
320344
} = metadata.targets();
345+
321346
assert_eq!(default, "i686-pc-windows-msvc");
322347
assert_eq!(others.len(), 1);
323348
assert!(others.contains(&"i686-apple-darwin"));
@@ -328,6 +353,7 @@ mod test {
328353
default_target: default,
329354
other_targets: others,
330355
} = metadata.targets();
356+
331357
assert_eq!(default, HOST_TARGET);
332358
assert!(others.is_empty());
333359

@@ -336,10 +362,12 @@ mod test {
336362
"i686-pc-windows-msvc".into(),
337363
"i686-pc-windows-msvc".into(),
338364
]);
365+
339366
let BuildTargets {
340367
default_target: default,
341368
other_targets: others,
342369
} = metadata.targets();
370+
343371
assert_eq!(default, "i686-pc-windows-msvc");
344372
assert!(others.is_empty());
345373

@@ -349,6 +377,7 @@ mod test {
349377
default_target: default,
350378
other_targets: others,
351379
} = metadata.targets();
380+
352381
assert_eq!(default, "i686-apple-darwin");
353382
assert_eq!(others.len(), 1);
354383
assert!(others.contains(&"i686-pc-windows-msvc"));
@@ -359,6 +388,7 @@ mod test {
359388
default_target: default,
360389
other_targets: others,
361390
} = metadata.targets();
391+
362392
assert_eq!(default, "i686-apple-darwin");
363393
assert!(others.is_empty());
364394

@@ -368,12 +398,14 @@ mod test {
368398
default_target: default,
369399
other_targets: others,
370400
} = metadata.targets();
401+
371402
assert_eq!(default, "i686-apple-darwin");
372403
let tier_one_targets_no_default = TARGETS
373404
.iter()
374405
.filter(|&&t| t != "i686-apple-darwin")
375406
.copied()
376407
.collect();
408+
377409
assert_eq!(others, tier_one_targets_no_default);
378410
}
379411
}

0 commit comments

Comments
 (0)