foundry_compilers_artifacts_solc/ast/
utils.rs

1use super::ExternalInlineAssemblyReference;
2use serde::{Deserialize, Deserializer, Serialize};
3use std::collections::BTreeMap;
4
5pub fn deserialize_external_assembly_references<'de, D>(
6    deserializer: D,
7) -> Result<Vec<ExternalInlineAssemblyReference>, D::Error>
8where
9    D: Deserializer<'de>,
10{
11    #[derive(Serialize, Deserialize)]
12    #[serde(untagged)]
13    enum ExternalReferencesHelper {
14        Plain(Vec<ExternalInlineAssemblyReference>),
15        /// Older solc versions produce external references as arrays of mappings {"variable" =>
16        /// external reference object}, so we have to handle this.
17        Map(Vec<BTreeMap<String, ExternalInlineAssemblyReference>>),
18    }
19
20    ExternalReferencesHelper::deserialize(deserializer).map(|v| match v {
21        ExternalReferencesHelper::Plain(vec) => vec,
22        ExternalReferencesHelper::Map(vec) => {
23            vec.into_iter().flat_map(|v| v.into_values()).collect()
24        }
25    })
26}