use std::sync::Arc;
use google_cloud_rust_raw::spanner::v1::{
spanner::{CreateSessionRequest, Session},
spanner_grpc::SpannerClient,
};
use grpcio::{CallOption, ChannelBuilder, ChannelCredentials, EnvBuilder, MetadataBuilder};
#[allow(dead_code)]
pub struct Client {
database: String,
client: SpannerClient,
session: Session,
}
impl Client {
pub fn new(database: &str) -> crate::Result<Client> {
let database = database.to_string();
let endpoint = "spanner.googleapis.com:443";
let env = Arc::new(EnvBuilder::new().build());
let creds = ChannelCredentials::google_default_credentials()?;
let chan = ChannelBuilder::new(Arc::clone(&env))
.max_send_message_len(100 << 20)
.max_receive_message_len(100 << 20)
.set_credentials(creds)
.connect(&endpoint);
let client = SpannerClient::new(chan);
let mut req = CreateSessionRequest::new();
req.set_database(database.to_string());
let mut meta = MetadataBuilder::new();
meta.add_str("google-cloud-resource-prefix", &database)?;
meta.add_str("x-goog-api-client", "googleapis-rs")?;
let opt = CallOption::default().headers(meta.build());
let session = client.create_session_opt(&req, opt)?;
Ok(Client {
database,
client,
session,
})
}
}