revive_solc_json_interface/standard_json/input/settings/selection/
mod.rs1pub mod file;
4
5use std::collections::BTreeMap;
6
7use serde::Deserialize;
8use serde::Serialize;
9
10use self::file::flag::Flag;
11use self::file::File as FileSelection;
12
13#[derive(Clone, Debug, Serialize, Deserialize, Default, PartialEq)]
15pub struct PerFileSelection {
16 #[serde(skip_serializing_if = "BTreeMap::is_empty", flatten)]
18 pub files: BTreeMap<String, FileSelection>,
19}
20
21impl PerFileSelection {
22 pub fn extend(&mut self, other: Self) {
24 for (entry, file) in other.files {
25 self.files
26 .entry(entry)
27 .and_modify(|v| {
28 v.extend(file.clone());
29 })
30 .or_insert(file);
31 }
32 }
33
34 pub fn selection_to_prune(&self) -> Self {
39 let files = self
40 .files
41 .iter()
42 .map(|(k, v)| (k.to_owned(), v.selection_to_prune()))
43 .collect();
44 Self { files }
45 }
46
47 pub fn contains(&self, path: &String, flag: &Flag) -> Option<bool> {
49 if let Some(file) = self.files.get(path) {
50 return Some(file.contains(flag));
51 };
52 None
53 }
54
55 pub fn is_empty(&self) -> bool {
57 self.files.is_empty()
58 }
59
60 pub fn retain(&mut self) {
62 for file in self.files.values_mut() {
63 file.per_contract.retain(Flag::is_required_for_codegen);
64 file.per_file.retain(Flag::is_required_for_codegen);
65 }
66 }
67}
68
69#[derive(Clone, Debug, Serialize, Deserialize, Default, PartialEq)]
71pub struct Selection {
72 #[serde(default, rename = "*", skip_serializing_if = "FileSelection::is_empty")]
74 pub all: FileSelection,
76 #[serde(skip_serializing_if = "PerFileSelection::is_empty", flatten)]
77 files: PerFileSelection,
78}
79
80impl Selection {
81 pub fn new(flags: Vec<Flag>) -> Self {
83 Self {
84 all: FileSelection::new(flags),
85 files: Default::default(),
86 }
87 }
88
89 pub fn new_required() -> Self {
91 Self::new(vec![
92 Flag::AST,
93 Flag::MethodIdentifiers,
94 Flag::Metadata,
95 Flag::Yul,
96 ])
97 }
98
99 pub fn new_required_for_tests() -> Self {
101 Self {
102 all: FileSelection::new_required_for_tests(),
103 files: Default::default(),
104 }
105 }
106
107 pub fn new_yul_validation() -> Self {
109 Self::new(vec![Flag::EVM])
110 }
111
112 pub fn extend(&mut self, other: Self) -> &mut Self {
114 self.all.extend(other.all);
115 self.files.extend(other.files);
116 self
117 }
118
119 pub fn selection_to_prune(&self) -> Self {
124 Self {
125 all: self.all.selection_to_prune(),
126 files: self.files.selection_to_prune(),
127 }
128 }
129
130 pub fn contains(&self, path: &String, flag: &Flag) -> bool {
132 self.files
133 .contains(path, flag)
134 .unwrap_or(self.all.contains(flag))
135 }
136
137 pub fn retain(&mut self) {
139 self.all.per_file.retain(Flag::is_required_for_codegen);
140 self.all.per_contract.retain(Flag::is_required_for_codegen);
141 self.files.retain();
142 }
143}