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 DatabaseOwned<C, S, I>
where C: crate::sqlite::SqliteTrait,
      S: traits::AsStatement,
      I: for<'b> std::convert::TryFrom<&'b rusqlite::Row<'b>, Error = rusqlite::Error>,
{
  conn: C,
  statement: S,
  phantom_i: std::marker::PhantomData<I>,
}

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

impl<C, S, I> traits::Selectable for DatabaseOwned<C, S, I> 
where C: crate::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()?)
  }
}