datasources 0.1.5

Async datasource interfaces, middleware, registry, and test doubles
Documentation
use super::bulk_insert_statement::flatten_bulk_parameters;
use super::statement::Statement;
use super::statement_text_renderer::StatementTextRenderer;
use crate::parameter::Parameter;

pub struct BulkUpdateRow {
    pub fields: Vec<Parameter>,
    pub ids: Vec<Parameter>,
}

pub struct BulkUpdateStatement {
    table: String,
    set: Vec<String>,
    ids: Vec<String>,
    rows: Vec<BulkUpdateRow>,
}

impl BulkUpdateStatement {
    pub fn new(
        table: impl AsRef<str>,
        set: &[String],
        ids: &[String],
        rows: Vec<BulkUpdateRow>,
    ) -> Self {
        Self {
            table: table.as_ref().to_string(),
            set: set.to_vec(),
            ids: ids.to_vec(),
            rows,
        }
    }

    pub fn table(&self) -> &str {
        &self.table
    }

    pub fn set(&self) -> &[String] {
        &self.set
    }

    pub fn ids(&self) -> &[String] {
        &self.ids
    }

    pub fn rows(&self) -> &[BulkUpdateRow] {
        &self.rows
    }

    pub fn parameters(&self) -> Vec<Parameter> {
        let columns: Vec<String> = self.set.iter().chain(self.ids.iter()).cloned().collect();
        let rows = self
            .rows
            .iter()
            .map(|row| {
                row.fields
                    .iter()
                    .chain(row.ids.iter())
                    .cloned()
                    .collect::<Vec<_>>()
            })
            .collect::<Vec<_>>();
        flatten_bulk_parameters(&columns, &rows)
    }
}

impl crate::ReadInput for BulkUpdateStatement {
    fn as_statement(&self) -> Option<&dyn crate::Statement> {
        Some(self)
    }
}

impl Statement for BulkUpdateStatement {
    fn accept(&self, text: &StatementTextRenderer) -> String {
        text.statements().visit_bulk_update(self, text)
    }

    fn as_any(&self) -> &dyn std::any::Any {
        self
    }
    fn kind(&self) -> super::statement::StatementKind {
        super::statement::StatementKind::Update
    }
}