use std::collections::HashMap;
use panproto_gat::Name;
use panproto_schema::Edge;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Migration {
pub vertex_map: HashMap<Name, Name>,
#[serde(with = "panproto_schema::serde_helpers::map_as_vec")]
pub edge_map: HashMap<Edge, Edge>,
pub hyper_edge_map: HashMap<Name, Name>,
#[serde(with = "panproto_schema::serde_helpers::map_as_vec")]
pub label_map: HashMap<(Name, Name), Name>,
#[serde(with = "panproto_schema::serde_helpers::map_as_vec")]
pub resolver: HashMap<(Name, Name), Edge>,
#[allow(clippy::type_complexity)]
#[serde(with = "panproto_schema::serde_helpers::map_as_vec")]
pub hyper_resolver: HashMap<(Name, Vec<Name>), (Name, HashMap<Name, Name>)>,
#[serde(default, with = "panproto_schema::serde_helpers::map_as_vec_default")]
pub expr_resolvers: HashMap<(Name, Name), panproto_expr::Expr>,
}
impl Migration {
#[must_use]
pub fn identity(vertices: &[Name], edges: &[Edge]) -> Self {
let vertex_map: HashMap<Name, Name> =
vertices.iter().map(|v| (v.clone(), v.clone())).collect();
let edge_map: HashMap<Edge, Edge> = edges.iter().map(|e| (e.clone(), e.clone())).collect();
Self {
vertex_map,
edge_map,
hyper_edge_map: HashMap::new(),
label_map: HashMap::new(),
resolver: HashMap::new(),
hyper_resolver: HashMap::new(),
expr_resolvers: HashMap::new(),
}
}
#[must_use]
pub fn empty() -> Self {
Self {
vertex_map: HashMap::new(),
edge_map: HashMap::new(),
hyper_edge_map: HashMap::new(),
label_map: HashMap::new(),
resolver: HashMap::new(),
hyper_resolver: HashMap::new(),
expr_resolvers: HashMap::new(),
}
}
}