use std::fmt;
use async_trait::async_trait;
use rmpv::Value;
use super::{Connection, Transaction, TransactionBuilder};
use crate::{codec::request::EncodedRequest, Executor, Result};
#[derive(Clone)]
pub struct Stream {
conn: Connection,
stream_id: u32,
}
impl Stream {
pub(crate) fn new(conn: Connection) -> Self {
let stream_id = conn.next_stream_id();
Self { conn, stream_id }
}
}
#[async_trait]
impl Executor for Stream {
async fn send_encoded_request(&self, mut request: EncodedRequest) -> Result<Value> {
request.stream_id = Some(self.stream_id);
self.conn.send_encoded_request(request).await
}
fn stream(&self) -> Stream {
self.conn.stream()
}
fn transaction_builder(&self) -> TransactionBuilder {
self.conn.transaction_builder()
}
async fn transaction(&self) -> Result<Transaction> {
self.conn.transaction().await
}
async fn get_cached_sql_statement_id(&self, statement: &str) -> Option<u64> {
self.conn.get_cached_sql_statement_id(statement).await
}
}
impl fmt::Debug for Stream {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Stream")
.field("stream_id", &self.stream_id)
.finish()
}
}