1 | use std::path::PathBuf; |
2 | |
3 | use crate::RegexSet; |
4 | |
5 | /// Trait used to turn [`crate::BindgenOptions`] fields into CLI args. |
6 | pub(super) trait AsArgs { |
7 | fn as_args(&self, args: &mut Vec<String>, flag: &str); |
8 | } |
9 | |
10 | /// If the `bool` is `true`, `flag` is pushed into `args`. |
11 | /// |
12 | /// be careful about the truth value of the field as some options, like `--no-layout-tests`, are |
13 | /// actually negations of the fields. |
14 | impl AsArgs for bool { |
15 | fn as_args(&self, args: &mut Vec<String>, flag: &str) { |
16 | if *self { |
17 | args.push(flag.to_string()); |
18 | } |
19 | } |
20 | } |
21 | |
22 | /// Iterate over all the items of the `RegexSet` and push `flag` followed by the item into `args` |
23 | /// for each item. |
24 | impl AsArgs for RegexSet { |
25 | fn as_args(&self, args: &mut Vec<String>, flag: &str) { |
26 | for item: &Box in self.get_items() { |
27 | args.extend_from_slice(&[flag.to_owned(), item.clone().into()]); |
28 | } |
29 | } |
30 | } |
31 | |
32 | /// If the `Option` is `Some(value)`, push `flag` followed by `value`. |
33 | impl AsArgs for Option<String> { |
34 | fn as_args(&self, args: &mut Vec<String>, flag: &str) { |
35 | if let Some(string: &String) = self { |
36 | args.extend_from_slice(&[flag.to_owned(), string.clone()]); |
37 | } |
38 | } |
39 | } |
40 | |
41 | /// If the `Option` is `Some(path)`, push `flag` followed by the [`std::path::Path::display`] |
42 | /// representation of `path`. |
43 | impl AsArgs for Option<PathBuf> { |
44 | fn as_args(&self, args: &mut Vec<String>, flag: &str) { |
45 | if let Some(path: &PathBuf) = self { |
46 | args.extend_from_slice(&[ |
47 | flag.to_owned(), |
48 | path.display().to_string(), |
49 | ]); |
50 | } |
51 | } |
52 | } |
53 | |