1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
//! A simple implementation of peano numbers.
//!
//! This is used to enforce that columns can only be selected from a given from
//! clause if their table appears exactly one time.
/// A table never appears in the from clause.
#[allow(missing_debug_implementations, missing_copy_implementations)]
pub struct Never;
/// A table appears in the from clause exactly one time.
#[allow(missing_debug_implementations, missing_copy_implementations)]
pub struct Once;
/// A table appears in the from clause two or more times.
#[allow(missing_debug_implementations, missing_copy_implementations)]
pub struct MoreThanOnce;
/// Add two peano numbers together.
///
/// This is used to determine the number of times a table appears in a from
/// clause when the from clause contains a join.
pub trait Plus<T> {
/// The result of adding these numbers together
type Output;
}
impl<T> Plus<T> for Never {
type Output = T;
}
impl<T> Plus<T> for MoreThanOnce {
type Output = Self;
}
impl Plus<Never> for Once {
type Output = Self;
}
impl Plus<Once> for Once {
type Output = MoreThanOnce;
}
impl Plus<MoreThanOnce> for Once {
type Output = MoreThanOnce;
}