//! The `solc --combined-json` contract. use std::collections::BTreeMap; use std::collections::HashSet; use serde::Deserialize; use serde::Serialize; /// The contract. #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Contract { /// The `solc` hashes output. #[serde(skip_serializing_if = "Option::is_none")] pub hashes: Option>, /// The `solc` ABI output. #[serde(skip_serializing_if = "Option::is_none")] pub abi: Option, /// The `solc` metadata output. #[serde(skip_serializing_if = "Option::is_none")] pub metadata: Option, /// The `solc` developer documentation output. #[serde(skip_serializing_if = "Option::is_none")] pub devdoc: Option, /// The `solc` user documentation output. #[serde(skip_serializing_if = "Option::is_none")] pub userdoc: Option, /// The `solc` storage layout output. #[serde(skip_serializing_if = "Option::is_none")] pub storage_layout: Option, /// The `solc` AST output. #[serde(skip_serializing_if = "Option::is_none")] pub ast: Option, /// The `solc` assembly output. #[serde(skip_serializing_if = "Option::is_none")] pub asm: Option, /// The `solc` hexadecimal binary output. #[serde(skip_serializing_if = "Option::is_none")] pub bin: Option, /// The `solc` hexadecimal binary runtime part output. #[serde(skip_serializing_if = "Option::is_none")] pub bin_runtime: Option, /// The factory dependencies. #[serde(skip_serializing_if = "Option::is_none")] pub factory_deps: Option>, /// The missing libraries. #[serde(skip_serializing_if = "Option::is_none")] pub missing_libraries: Option>, } impl Contract { /// Returns the signature hash of the specified contract entry. /// # Panics /// If the hashes have not been requested in the `solc` call. pub fn entry(&self, entry: &str) -> u32 { self.hashes .as_ref() .expect("Always exists") .iter() .find_map(|(contract_entry, hash)| { if contract_entry.starts_with(entry) { Some( u32::from_str_radix(hash.as_str(), revive_common::BASE_HEXADECIMAL) .expect("Test hash is always valid"), ) } else { None } }) .unwrap_or_else(|| panic!("Entry `{entry}` not found")) } }