revive_solc_json_interface/standard_json/input/settings/
mod.rs1pub mod metadata;
4pub mod metadata_hash;
5pub mod optimizer;
6pub mod polkavm;
7pub mod selection;
8
9use std::collections::BTreeMap;
10use std::collections::BTreeSet;
11
12use serde::Deserialize;
13use serde::Serialize;
14
15use self::metadata::Metadata;
16use self::optimizer::Optimizer;
17use self::polkavm::PolkaVM;
18use self::selection::Selection;
19
20#[derive(Clone, Debug, Serialize, Deserialize)]
22#[serde(rename_all = "camelCase")]
23pub struct Settings {
24 #[serde(skip_serializing_if = "Option::is_none")]
26 pub evm_version: Option<revive_common::EVMVersion>,
27 #[serde(default, skip_serializing_if = "Option::is_none")]
29 pub libraries: Option<BTreeMap<String, BTreeMap<String, String>>>,
30 #[serde(skip_serializing_if = "Option::is_none")]
32 pub remappings: Option<BTreeSet<String>>,
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub output_selection: Option<Selection>,
36 #[serde(
38 rename = "viaIR",
39 skip_serializing_if = "Option::is_none",
40 skip_deserializing
41 )]
42 pub via_ir: Option<bool>,
43 pub optimizer: Optimizer,
45 #[serde(skip_serializing_if = "Option::is_none")]
47 pub metadata: Option<Metadata>,
48 #[serde(skip_serializing)]
50 pub polkavm: Option<PolkaVM>,
51}
52
53impl Settings {
54 pub fn new(
56 evm_version: Option<revive_common::EVMVersion>,
57 libraries: BTreeMap<String, BTreeMap<String, String>>,
58 remappings: Option<BTreeSet<String>>,
59 output_selection: Selection,
60 optimizer: Optimizer,
61 metadata: Option<Metadata>,
62 polkavm: Option<PolkaVM>,
63 ) -> Self {
64 Self {
65 evm_version,
66 libraries: Some(libraries),
67 remappings,
68 output_selection: Some(output_selection),
69 optimizer,
70 metadata,
71 via_ir: Some(true),
72 polkavm,
73 }
74 }
75
76 pub fn normalize(&mut self, version: &semver::Version) {
78 self.optimizer.normalize(version);
79 }
80
81 pub fn parse_libraries(
83 input: Vec<String>,
84 ) -> anyhow::Result<BTreeMap<String, BTreeMap<String, String>>> {
85 let mut libraries = BTreeMap::new();
86 for (index, library) in input.into_iter().enumerate() {
87 let mut path_and_address = library.split('=');
88 let path = path_and_address
89 .next()
90 .ok_or_else(|| anyhow::anyhow!("The library #{} path is missing", index))?;
91 let mut file_and_contract = path.split(':');
92 let file = file_and_contract
93 .next()
94 .ok_or_else(|| anyhow::anyhow!("The library `{}` file name is missing", path))?;
95 let contract = file_and_contract.next().ok_or_else(|| {
96 anyhow::anyhow!("The library `{}` contract name is missing", path)
97 })?;
98 let address = path_and_address
99 .next()
100 .ok_or_else(|| anyhow::anyhow!("The library `{}` address is missing", path))?;
101 libraries
102 .entry(file.to_owned())
103 .or_insert_with(BTreeMap::new)
104 .insert(contract.to_owned(), address.to_owned());
105 }
106 Ok(libraries)
107 }
108}