cleu-orm 0.1.0

Object–relational mapping
Documentation
use crate::{Association, Associations, Field, Fields, FullAssociation, SqlWriter, TableParams};
use arrayvec::ArrayString;
use core::array;

macro_rules! tuple_impls {
  ($(
    $tuple_len:tt {
      $(($idx:tt) -> $T:ident)+
    }
  )+) => {
    $(
      impl<ERR, $($T: TableParams<Error = ERR>),+> Associations for ($( ($T, Association), )+)
      where
        ERR: From<crate::Error>
      {
        type FullAssociations<'x> = array::IntoIter<FullAssociation<'x>, $tuple_len>;

        #[inline]
        fn full_associations<'a>(&'a self) -> Self::FullAssociations<'a> {
          [
            $(
              FullAssociation::new(
                &self.$idx.1,
                $T::table_name(),
                $T::table_name_alias(),
                self.$idx.0.suffix()
              ),
            )+
          ].into_iter()
        }
      }

      impl<ERR, $($T,)+ const N: usize> SqlWriter<N> for ($( ($T, Association), )+)
      where
        ERR: From<crate::Error>,
        $(
          $T: TableParams<Error = ERR>,
          $T::Associations: SqlWriter<N, Error = ERR>,
        )+
      {
        type Error = ERR;

        #[inline]
        fn write_select(&self, buffer: &mut ArrayString<N>, where_str: &str) -> Result<(), Self::Error> {
          $(
            self.$idx.0.write_select(buffer, where_str)?;
          )+
          Ok(())
        }

        #[inline]
        fn write_select_associations(
          &self,
            buffer: &mut ArrayString<N>,
        ) -> Result<(), Self::Error> {
          $(
            self.$idx.0.write_select_associations(buffer)?;
          )+
          Ok(())
        }

        #[inline]
        fn write_select_fields(
          &self,
            buffer: &mut ArrayString<N>,
        ) -> Result<(), Self::Error> {
          $(
            self.$idx.0.write_select_fields(buffer)?;
          )+
          Ok(())
        }

        #[inline]
        fn write_select_orders_by(&self, buffer: &mut ArrayString<N>) -> Result<(), Self::Error> {
          $(
            self.$idx.0.write_select_orders_by(buffer)?;
          )+
          Ok(())
        }
      }

      impl<$($T),+> Fields for ($( Field<$T>, )+) {
        type FieldNames = array::IntoIter<&'static str, $tuple_len>;

        #[inline]
        fn field_names(&self) -> Self::FieldNames {
          [ $( self.$idx.name(), )+ ].into_iter()
        }
      }
    )+
  }
}

tuple_impls! {
  1 {
    (0) -> A
  }
  2 {
    (0) -> A
    (1) -> B
  }
  3 {
    (0) -> A
    (1) -> B
    (2) -> C
  }
  4 {
    (0) -> A
    (1) -> B
    (2) -> C
    (3) -> D
  }
  5 {
    (0) -> A
    (1) -> B
    (2) -> C
    (3) -> D
    (4) -> E
  }
  6 {
    (0) -> A
    (1) -> B
    (2) -> C
    (3) -> D
    (4) -> E
    (5) -> F
  }
  7 {
    (0) -> A
    (1) -> B
    (2) -> C
    (3) -> D
    (4) -> E
    (5) -> F
    (6) -> G
  }
  8 {
    (0) -> A
    (1) -> B
    (2) -> C
    (3) -> D
    (4) -> E
    (5) -> F
    (6) -> G
    (7) -> H
  }
  9 {
    (0) -> A
    (1) -> B
    (2) -> C
    (3) -> D
    (4) -> E
    (5) -> F
    (6) -> G
    (7) -> H
    (8) -> I
  }
  10 {
    (0) -> A
    (1) -> B
    (2) -> C
    (3) -> D
    (4) -> E
    (5) -> F
    (6) -> G
    (7) -> H
    (8) -> I
    (9) -> J
  }
  11 {
    (0) -> A
    (1) -> B
    (2) -> C
    (3) -> D
    (4) -> E
    (5) -> F
    (6) -> G
    (7) -> H
    (8) -> I
    (9) -> J
    (10) -> K
  }
  12 {
    (0) -> A
    (1) -> B
    (2) -> C
    (3) -> D
    (4) -> E
    (5) -> F
    (6) -> G
    (7) -> H
    (8) -> I
    (9) -> J
    (10) -> K
    (11) -> L
  }
}