bat-cli 0.9.0

Blockchain Auditor Toolkit (BAT)
use crate::batbelt::metadata::{BatMetadata, MetadataId, MetadataResult};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct FunctionDependencyInfo {
    pub function_name: String,
    pub function_metadata_id: String,
}

#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct FunctionDependenciesMetadata {
    pub function_name: String,
    pub metadata_id: MetadataId,
    pub function_metadata_id: String,
    pub dependencies: Vec<FunctionDependencyInfo>,
    pub external_dependencies: Vec<MetadataId>,
}

impl FunctionDependenciesMetadata {
    pub fn new(
        function_name: String,
        metadata_id: MetadataId,
        function_metadata_id: String,
        dependencies: Vec<FunctionDependencyInfo>,
        external_dependencies: Vec<MetadataId>,
    ) -> Self {
        Self {
            function_name,
            metadata_id,
            function_metadata_id,
            dependencies,
            external_dependencies,
        }
    }

    pub fn update_metadata_file(&self) -> MetadataResult<()> {
        let self_clone = self.clone();
        BatMetadata::update_metadata(|bat_metadata| {
            let position = bat_metadata
                .function_dependencies
                .iter()
                .position(|ep| ep.function_metadata_id == self_clone.function_metadata_id);
            match position {
                None => bat_metadata.function_dependencies.push(self_clone.clone()),
                Some(pos) => bat_metadata.function_dependencies[pos] = self_clone.clone(),
            };
            bat_metadata
                .function_dependencies
                .sort_by_key(|func_dep| func_dep.function_name.clone());
        })
    }
}