use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
pub use crate::db::r#move::move_function_metadata::MoveVisibility;
pub use crate::db::r#move::move_struct_ability::MoveAbility;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct MoveStruct {
pub id: i32,
pub contract_id: i32,
pub name: String,
pub abilities: Vec<MoveAbility>,
pub generic_params: Vec<MoveGenericParam>,
pub fields: Vec<MoveField>,
}
impl MoveStruct {
pub fn is_sui_object(&self) -> bool {
self.abilities.contains(&MoveAbility::Key)
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct MoveGenericParam {
pub name: String,
pub constraints: Vec<MoveAbility>,
pub phantom: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct MoveField {
pub name: String,
pub type_repr: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct MoveFunctionMetadata {
pub function_id: i32,
pub visibility: MoveVisibility,
pub is_entry: bool,
pub generic_params: Vec<MoveGenericParam>,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct MovePackageStructure {
pub function_metadata: Vec<MoveFunctionMetadata>,
pub structs: Vec<MoveStruct>,
}
impl MovePackageStructure {
pub fn structs_by_id(&self) -> BTreeMap<i32, &MoveStruct> {
self.structs.iter().map(|s| (s.id, s)).collect()
}
pub fn structs_by_contract(&self) -> BTreeMap<i32, Vec<&MoveStruct>> {
let mut out: BTreeMap<i32, Vec<&MoveStruct>> = BTreeMap::new();
for s in &self.structs {
out.entry(s.contract_id).or_default().push(s);
}
out
}
pub fn function_metadata_by_id(&self) -> BTreeMap<i32, &MoveFunctionMetadata> {
self.function_metadata
.iter()
.map(|m| (m.function_id, m))
.collect()
}
}