derive-sql 0.13.0

Structure the interaction with SQL databases - currently SQLite and MySQL via trait and a procedural macro
Documentation
use super::*;

pub struct Database<'a, C, S, I>
where C: proxy::sqlite::SqliteTrait,
      S: traits::AsStatement,
      I: for<'b> std::convert::TryFrom<&'b rusqlite::Row<'b>, Error = rusqlite::Error>,
{
  conn: &'a C,
  statement: S,
  phantom_i: std::marker::PhantomData<I>,
}

impl<'a, C, S, I> std::convert::From<&'a C> for Database<'a, C, S, I>
where C: proxy::sqlite::SqliteTrait,
      S: traits::AsStatement + std::default::Default,
      I: for<'b> std::convert::TryFrom<&'b rusqlite::Row<'b>, Error = rusqlite::Error>
{
  fn from(conn: &'a C) -> Self {
    Database { 
      conn, 
      statement: S::default(),
      phantom_i: std::marker::PhantomData,
    }
  }
}

impl<'a, C, S, I> Database<'a, C, S, I> 
where C: proxy::sqlite::SqliteTrait,
      S: traits::AsStatement,
      I: for<'b> std::convert::TryFrom<&'b rusqlite::Row<'b>, Error = rusqlite::Error>,
{
  pub fn from_conn_statement(conn: &'a C, statement: S) -> Database<'a, C, S, I> {
    Database {
      conn,
      statement,
      phantom_i: std::marker::PhantomData,
    }
  }
}

impl<'a, C, S, I> traits::Selectable for Database<'a, C, S, I> 
where C: proxy::sqlite::SqliteTrait,
      S: traits::AsStatement,
      I: for<'b> std::convert::TryFrom<&'b rusqlite::Row<'b>, Error = rusqlite::Error>,
{
  type Item = I;
  fn select_with_statement(&self, statement: String) -> DeriveSqlResult<Vec<Self::Item>> {
    self.conn.query_map(statement.as_str(), 
      [],
      |r| r.try_into())
  }

  fn statement(&self) -> DeriveSqlResult<String> {
    Ok(self.statement.into_statement()?)
  }
}