revive_solc_json_interface/standard_json/input/settings/
mod.rs

1//! The `solc --standard-json` input settings.
2
3pub 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/// The `solc --standard-json` input settings.
21#[derive(Clone, Debug, Serialize, Deserialize)]
22#[serde(rename_all = "camelCase")]
23pub struct Settings {
24    /// The target EVM version.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub evm_version: Option<revive_common::EVMVersion>,
27    /// The linker library addresses.
28    #[serde(default, skip_serializing_if = "Option::is_none")]
29    pub libraries: Option<BTreeMap<String, BTreeMap<String, String>>>,
30    /// The sorted list of remappings.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub remappings: Option<BTreeSet<String>>,
33    /// The output selection filters.
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub output_selection: Option<Selection>,
36    /// Whether to compile via IR. Only for testing with solc >=0.8.13.
37    #[serde(
38        rename = "viaIR",
39        skip_serializing_if = "Option::is_none",
40        skip_deserializing
41    )]
42    pub via_ir: Option<bool>,
43    /// The optimizer settings.
44    pub optimizer: Optimizer,
45    /// The metadata settings.
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub metadata: Option<Metadata>,
48    /// The resolc custom PolkaVM settings.
49    #[serde(skip_serializing)]
50    pub polkavm: Option<PolkaVM>,
51}
52
53impl Settings {
54    /// A shortcut constructor.
55    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    /// Sets the necessary defaults.
77    pub fn normalize(&mut self, version: &semver::Version) {
78        self.optimizer.normalize(version);
79    }
80
81    /// Parses the library list and returns their double hashmap with path and name as keys.
82    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}