use super::SchemaStoreError;
use super::api::SchemaStoreApi;
use super::request::Request;
use super::types::*;
use crate::Dsh;
pub struct SchemaStoreClient<C: Request> {
pub(crate) base_url: String,
pub(crate) client: C,
}
impl SchemaStoreClient<reqwest::Client> {
pub fn new() -> Self {
Self::new_with_base_url(Dsh::get().schema_registry_host())
}
pub fn new_with_base_url(base_url: &str) -> Self {
Self {
base_url: base_url.trim_end_matches('/').to_string(),
client: Request::new_client(),
}
}
}
impl<C> SchemaStoreClient<C>
where
C: Request,
{
pub async fn subject_compatibility(
&self,
subject: &SubjectName,
) -> Result<Compatibility, SchemaStoreError> {
Ok(self.get_config_subject(subject.name()).await?.into())
}
pub async fn subject_compatibility_update(
&self,
subject: &SubjectName,
compatibility: Compatibility,
) -> Result<Compatibility, SchemaStoreError> {
Ok(self
.put_config_subject(subject.name(), compatibility)
.await?
.into())
}
pub async fn subjects(&self) -> Result<Vec<String>, SchemaStoreError> {
self.get_subjects().await
}
pub async fn subject_versions(
&self,
subject: &SubjectName,
) -> Result<Vec<i32>, SchemaStoreError> {
self.get_subjects_subject_versions(subject.name()).await
}
pub async fn subject<V>(
&self,
subject: &SubjectName,
version: V,
) -> Result<Subject, SchemaStoreError>
where
V: Into<SubjectVersion>,
{
let subject = subject.name();
let version = version.into();
self.get_subjects_subject_versions_id(subject, version.to_string())
.await
}
pub async fn subject_raw_schema<V>(
&self,
subject: &SubjectName,
version: V,
) -> Result<String, SchemaStoreError>
where
V: Into<SubjectVersion>,
{
self.get_subjects_subject_versions_id_schema(subject.name(), version.into().to_string())
.await
}
pub async fn subject_all_schemas(
&self,
subject: &SubjectName,
) -> Result<Vec<Subject>, SchemaStoreError> {
let versions = self.subject_versions(subject).await?;
let mut subjects = Vec::new();
for version in versions {
let subject_schema = self.subject(subject, version).await?;
subjects.push(subject_schema);
}
Ok(subjects)
}
pub async fn subject_add_schema(
&self,
subject: &SubjectName,
schema: RawSchemaWithType,
) -> Result<i32, SchemaStoreError> {
Ok(self
.post_subjects_subject_versions(subject.name(), schema)
.await?
.id())
}
pub async fn subject_schema_exist(
&self,
subject: &SubjectName,
schema: RawSchemaWithType,
) -> Result<Subject, SchemaStoreError> {
self.post_subjects_subject(subject.name(), schema).await
}
pub async fn subject_new_schema_compatibility<Sv>(
&self,
subject: &SubjectName,
version: Sv,
schema: RawSchemaWithType,
) -> Result<bool, SchemaStoreError>
where
Sv: Into<SubjectVersion>,
{
Ok(self
.post_compatibility_subjects_subject_versions_id(
subject.name(),
version.into().to_string(),
schema,
)
.await?
.is_compatible())
}
pub async fn schema<Si>(&self, id: Si) -> Result<RawSchemaWithType, SchemaStoreError>
where
Si: Into<i32>,
{
self.get_schemas_ids_id(id.into()).await
}
pub async fn schema_subjects<Si>(
&self,
id: Si,
) -> Result<Vec<SubjectVersionInfo>, SchemaStoreError>
where
Si: Into<i32>,
{
self.get_schemas_ids_id_versions(id.into()).await
}
}