sqlc-gen-sqlx 0.2.1

A sqlc plugin that generates type-safe sqlx Rust code from SQL queries.
Documentation
---
source: tests/codegen.rs
expression: code
---
// Code generated by sqlc-gen-sqlx v[VERSION]. DO NOT EDIT.
// sqlc version: [VERSION]

#![allow(
    dead_code,
    reason = "generated queries may expose items a caller does not use"
)]

pub trait AsExecutor {
    fn as_executor(&mut self) -> impl sqlx::Executor<'_, Database = sqlx::Postgres>;
}
impl AsExecutor for sqlx::PgPool {
    fn as_executor(&mut self) -> impl sqlx::Executor<'_, Database = sqlx::Postgres> {
        &*self
    }
}
impl AsExecutor for &sqlx::PgPool {
    fn as_executor(&mut self) -> impl sqlx::Executor<'_, Database = sqlx::Postgres> {
        *self
    }
}
impl AsExecutor for sqlx::PgConnection {
    fn as_executor(&mut self) -> impl sqlx::Executor<'_, Database = sqlx::Postgres> {
        &mut *self
    }
}
impl AsExecutor for sqlx::Transaction<'_, sqlx::Postgres> {
    fn as_executor(&mut self) -> impl sqlx::Executor<'_, Database = sqlx::Postgres> {
        &mut **self
    }
}
impl AsExecutor for sqlx::pool::PoolConnection<sqlx::Postgres> {
    fn as_executor(&mut self) -> impl sqlx::Executor<'_, Database = sqlx::Postgres> {
        &mut **self
    }
}
impl<T: AsExecutor + ?Sized> AsExecutor for &mut T {
    fn as_executor(&mut self) -> impl sqlx::Executor<'_, Database = sqlx::Postgres> {
        (**self).as_executor()
    }
}
#[derive(Debug, Clone)]
pub struct BatchUpdateAuthorParams<'a> {
    pub name: &'a str,
    pub bio: Option<&'a str>,
    pub id: i64,
}
const BATCH_UPDATE_AUTHOR: &str = "UPDATE authors SET name = $1, bio = $2 WHERE id = $3";
pub fn batch_update_author<'a, E, I>(
    db: E,
    items: I,
) -> impl futures_core::stream::Stream<Item = Result<(), sqlx::Error>> + 'a
where
    E: AsExecutor + 'a,
    I: IntoIterator<Item = BatchUpdateAuthorParams<'a>> + 'a,
    I::IntoIter: 'a,
{
    futures_util::stream::try_unfold(
        (db, items.into_iter()),
        |(mut db, mut items)| async move {
            let Some(item) = items.next() else {
                return Ok(None);
            };
            sqlx::query(BATCH_UPDATE_AUTHOR)
                .bind(item.name)
                .bind(item.bio)
                .bind(item.id)
                .execute(db.as_executor())
                .await?;
            Ok(Some(((), (db, items))))
        },
    )
}