Skip to main content

dada_ir_sym/check/predicates/
require_where_clause.rs

1use dada_ir_ast::diagnostic::Errors;
2
3use crate::{
4    check::{env::Env, report::OrElse},
5    ir::generics::{SymWhereClause, SymWhereClauseKind},
6};
7
8use super::{
9    require_lent::require_term_is_lent, require_owned::require_term_is_owned,
10    require_shared::require_term_is_shared, require_unique::require_term_is_unique,
11};
12
13pub async fn require_where_clause<'db>(
14    env: &mut Env<'db>,
15    where_clause: SymWhereClause<'db>,
16    or_else: &dyn OrElse<'db>,
17) -> Errors<()> {
18    let db = env.db();
19    let subject = where_clause.subject(db);
20    match where_clause.kind(db) {
21        SymWhereClauseKind::Unique => require_term_is_unique(env, subject, or_else).await,
22        SymWhereClauseKind::Shared => require_term_is_shared(env, subject, or_else).await,
23        SymWhereClauseKind::Owned => require_term_is_owned(env, subject, or_else).await,
24        SymWhereClauseKind::Lent => require_term_is_lent(env, subject, or_else).await,
25    }
26}