use crate::error::Result;
use crate::models::{Predicate, QueryRequest, QueryResponse, SqlResponse};
use serde_json::Value as JsonValue;
pub struct Client {
inner: crate::Client,
rt: tokio::runtime::Runtime,
}
impl Client {
pub fn new(base_url: impl Into<String>) -> Result<Self> {
Self::from_async(crate::Client::new(base_url)?)
}
pub fn from_async(inner: crate::Client) -> Result<Self> {
let rt = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.map_err(|e| crate::ClientError::Decode(format!("runtime build failed: {e}")))?;
Ok(Self { inner, rt })
}
pub fn builder(base_url: impl Into<String>) -> crate::ClientBuilder {
crate::ClientBuilder::new(base_url)
}
pub fn healthz(&self) -> Result<JsonValue> {
self.rt.block_on(self.inner.healthz())
}
pub fn readyz(&self) -> Result<JsonValue> {
self.rt.block_on(self.inner.readyz())
}
pub fn datasets(&self) -> Result<Vec<String>> {
self.rt.block_on(self.inner.datasets())
}
pub fn schema(&self, dataset: &str) -> Result<JsonValue> {
self.rt.block_on(self.inner.schema(dataset))
}
pub fn count(&self, dataset: &str, predicates: &[Predicate]) -> Result<u64> {
self.rt.block_on(self.inner.count(dataset, predicates))
}
pub fn query_json(&self, dataset: &str, request: &QueryRequest) -> Result<QueryResponse> {
self.rt.block_on(self.inner.query_json(dataset, request))
}
pub fn sql(&self, sql: impl Into<String>, max_rows: Option<u64>) -> Result<SqlResponse> {
self.rt.block_on(self.inner.sql(sql, max_rows))
}
pub fn reload(&self, dataset: &str) -> Result<JsonValue> {
self.rt.block_on(self.inner.reload(dataset))
}
pub fn query_arrow_bytes(
&self,
dataset: &str,
request: &QueryRequest,
) -> Result<bytes::Bytes> {
self.rt
.block_on(self.inner.query_arrow_bytes(dataset, request))
}
#[cfg(feature = "arrow")]
pub fn query_arrow(
&self,
dataset: &str,
request: &QueryRequest,
) -> Result<Vec<arrow::record_batch::RecordBatch>> {
self.rt.block_on(self.inner.query_arrow(dataset, request))
}
pub fn inner(&self) -> &crate::Client {
&self.inner
}
}