use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use crate::catalog::relation_oids::RelationCatalogOids;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct LabelCatalogOids {
pub sequence: u32,
pub relation: RelationCatalogOids,
pub id_default: u32,
pub properties_default: u32,
pub not_null: BTreeMap<String, u32>,
pub toast_table: u32,
pub toast_index: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub primary_key: Option<IndexConstraintOids>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub endpoint_indexes: Option<EndpointIndexOids>,
pub trigger: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct IndexConstraintOids {
pub index: u32,
pub constraint: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct EndpointIndexOids {
pub start_id: u32,
pub end_id: u32,
}
impl LabelCatalogOids {
pub fn claimed(&self) -> impl Iterator<Item = u32> + '_ {
[
self.sequence,
self.id_default,
self.properties_default,
self.toast_table,
self.toast_index,
self.trigger,
]
.into_iter()
.chain(self.relation.claimed())
.chain(self.not_null.values().copied())
.chain(
self.primary_key
.iter()
.flat_map(|key| [key.index, key.constraint]),
)
.chain(
self.endpoint_indexes
.iter()
.flat_map(|indexes| [indexes.start_id, indexes.end_id]),
)
}
}