1use crate::db_type::{DatabaseKeyDefinition, DatabaseSecondaryKeyOptions, Error, Result};
2use std::collections::HashSet;
3
4#[derive(Clone, Debug)]
5pub struct DatabaseModel {
6 pub primary_key: DatabaseKeyDefinition<()>,
7 pub secondary_keys: HashSet<DatabaseKeyDefinition<DatabaseSecondaryKeyOptions>>,
8}
9
10impl DatabaseModel {
11 pub fn check_secondary_options<F>(
12 &self,
13 secondary_key: &DatabaseKeyDefinition<DatabaseSecondaryKeyOptions>,
14 check: F,
15 ) -> Result<()>
16 where
17 F: Fn(DatabaseSecondaryKeyOptions) -> bool,
18 {
19 let key = self
20 .secondary_keys
21 .get(secondary_key.into())
22 .ok_or_else(|| Error::SecondaryKeyDefinitionNotFound {
23 table: self.primary_key.unique_table_name.to_string(),
24 key: secondary_key.unique_table_name.clone(),
25 })?;
26
27 if check(key.options.clone()) {
28 Ok(())
29 } else {
30 Err(Error::SecondaryKeyConstraintMismatch {
31 table: self.primary_key.unique_table_name.to_string(),
32 key: secondary_key.unique_table_name.clone(),
33 got: key.options.clone(),
34 })
35 }
36 }
37}