spanner-rs 0.3.0

Cloud Spanner Rust Client
Documentation
use bb8::ManageConnection;
use tokio::sync::Mutex;

use crate::Connection;
use crate::Error;
use google_api_proto::google::spanner::v1 as proto;
pub(crate) struct Session(String);

impl Session {
    pub fn name(&self) -> &str {
        &self.0
    }
}

impl From<proto::Session> for Session {
    fn from(value: proto::Session) -> Self {
        Self(value.name)
    }
}

pub(crate) struct SessionManager {
    connection: Mutex<Box<dyn Connection>>,
}

impl SessionManager {
    pub(crate) fn new(connection: Box<dyn Connection>) -> Self {
        Self {
            connection: Mutex::new(connection),
        }
    }
}

#[async_trait::async_trait]
impl ManageConnection for SessionManager {
    type Connection = Session;
    type Error = Error;

    async fn connect(&self) -> Result<Self::Connection, Self::Error> {
        self.connection.lock().await.create_session().await
    }

    async fn is_valid(&self, _conn: &mut Self::Connection) -> Result<(), Self::Error> {
        Ok(())
    }

    fn has_broken(&self, _conn: &mut Self::Connection) -> bool {
        false
    }
}