use crate::errors::HivehookError;
use crate::resources::_base::{put_opt, vars};
#[cfg(feature = "blocking")]
use crate::transport::BlockingGraphQLTransport;
use crate::types::{ListResult, StreamSink};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
const FRAGMENT: &str = "id streamId name sinkType config batchSize flushInterval cursorSequence status lastFlushedAt createdAt";
#[non_exhaustive]
#[derive(Debug, Default, Clone)]
pub struct ListStreamSinksOptions {
pub status: Option<String>,
pub search: Option<String>,
pub limit: Option<i32>,
pub offset: Option<i32>,
pub after: Option<String>,
pub first: Option<i32>,
}
#[non_exhaustive]
#[derive(Debug, Default, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateStreamSinkInput {
pub stream_id: String,
pub name: String,
pub sink_type: String,
pub config: HashMap<String, Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub batch_size: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub flush_interval: Option<String>,
}
#[non_exhaustive]
#[derive(Debug, Default, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateStreamSinkInput {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub config: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub batch_size: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub flush_interval: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
}
#[derive(Deserialize)]
struct ListData {
#[serde(rename = "streamSinks")]
stream_sinks: ListResult<StreamSink>,
}
#[derive(Deserialize)]
struct GetData {
#[serde(rename = "streamSink")]
stream_sink: Option<StreamSink>,
}
#[derive(Deserialize)]
struct CreateData {
#[serde(rename = "createStreamSink")]
create_stream_sink: StreamSink,
}
#[derive(Deserialize)]
struct UpdateData {
#[serde(rename = "updateStreamSink")]
update_stream_sink: StreamSink,
}
#[derive(Deserialize)]
struct DeleteData {
#[serde(rename = "deleteStreamSink")]
delete_stream_sink: bool,
}
#[cfg(feature = "blocking")]
pub struct StreamSinkService<'a> {
pub(crate) transport: &'a BlockingGraphQLTransport,
}
#[cfg(feature = "blocking")]
impl<'a> StreamSinkService<'a> {
pub fn list(
&self,
stream_id: &str,
options: ListStreamSinksOptions,
) -> Result<ListResult<StreamSink>, HivehookError> {
let query = format!(
r#"query($streamId: UUID!, $status: SinkStatus, $search: String, $limit: Int, $offset: Int, $after: String, $first: Int) {{
streamSinks(streamId: $streamId, status: $status, search: $search, limit: $limit, offset: $offset, after: $after, first: $first) {{
nodes {{ {FRAGMENT} }}
pageInfo {{ total limit offset endCursor hasNextPage }}
}}
}}"#
);
let mut v = vars();
v.insert("streamId".into(), Value::String(stream_id.into()));
put_opt(&mut v, "status", options.status);
put_opt(&mut v, "search", options.search);
put_opt(&mut v, "limit", options.limit);
put_opt(&mut v, "offset", options.offset);
put_opt(&mut v, "after", options.after);
put_opt(&mut v, "first", options.first);
let data: ListData = self.transport.execute(&query, Some(v))?;
Ok(data.stream_sinks)
}
pub fn get(&self, id: &str) -> Result<Option<StreamSink>, HivehookError> {
let query = format!("query($id: UUID!) {{ streamSink(id: $id) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
let data: GetData = self.transport.execute(&query, Some(v))?;
Ok(data.stream_sink)
}
pub fn create(&self, input: CreateStreamSinkInput) -> Result<StreamSink, HivehookError> {
let query = format!("mutation($input: CreateStreamSinkInput!) {{ createStreamSink(input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("input".into(), serde_json::to_value(input)?);
let data: CreateData = self.transport.execute(&query, Some(v))?;
Ok(data.create_stream_sink)
}
pub fn update(
&self,
id: &str,
input: UpdateStreamSinkInput,
) -> Result<StreamSink, HivehookError> {
let query = format!("mutation($id: UUID!, $input: UpdateStreamSinkInput!) {{ updateStreamSink(id: $id, input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
v.insert("input".into(), serde_json::to_value(input)?);
let data: UpdateData = self.transport.execute(&query, Some(v))?;
Ok(data.update_stream_sink)
}
pub fn delete(&self, id: &str) -> Result<bool, HivehookError> {
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
let data: DeleteData = self.transport.execute(
"mutation($id: UUID!) { deleteStreamSink(id: $id) }",
Some(v),
)?;
Ok(data.delete_stream_sink)
}
}
#[cfg(feature = "async")]
#[cfg_attr(docsrs, doc(cfg(feature = "async")))]
pub struct AsyncStreamSinkService<'a> {
pub(crate) transport: &'a crate::transport::AsyncGraphQLTransport,
}
#[cfg(feature = "async")]
impl<'a> AsyncStreamSinkService<'a> {
pub async fn list(
&self,
stream_id: &str,
options: ListStreamSinksOptions,
) -> Result<ListResult<StreamSink>, HivehookError> {
let query = format!(
r#"query($streamId: UUID!, $status: SinkStatus, $search: String, $limit: Int, $offset: Int, $after: String, $first: Int) {{
streamSinks(streamId: $streamId, status: $status, search: $search, limit: $limit, offset: $offset, after: $after, first: $first) {{
nodes {{ {FRAGMENT} }}
pageInfo {{ total limit offset endCursor hasNextPage }}
}}
}}"#
);
let mut v = vars();
v.insert("streamId".into(), Value::String(stream_id.into()));
put_opt(&mut v, "status", options.status);
put_opt(&mut v, "search", options.search);
put_opt(&mut v, "limit", options.limit);
put_opt(&mut v, "offset", options.offset);
put_opt(&mut v, "after", options.after);
put_opt(&mut v, "first", options.first);
let data: ListData = self.transport.execute(&query, Some(v)).await?;
Ok(data.stream_sinks)
}
pub async fn get(&self, id: &str) -> Result<Option<StreamSink>, HivehookError> {
let query = format!("query($id: UUID!) {{ streamSink(id: $id) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
let data: GetData = self.transport.execute(&query, Some(v)).await?;
Ok(data.stream_sink)
}
pub async fn create(&self, input: CreateStreamSinkInput) -> Result<StreamSink, HivehookError> {
let query = format!("mutation($input: CreateStreamSinkInput!) {{ createStreamSink(input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("input".into(), serde_json::to_value(input)?);
let data: CreateData = self.transport.execute(&query, Some(v)).await?;
Ok(data.create_stream_sink)
}
pub async fn update(
&self,
id: &str,
input: UpdateStreamSinkInput,
) -> Result<StreamSink, HivehookError> {
let query = format!("mutation($id: UUID!, $input: UpdateStreamSinkInput!) {{ updateStreamSink(id: $id, input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
v.insert("input".into(), serde_json::to_value(input)?);
let data: UpdateData = self.transport.execute(&query, Some(v)).await?;
Ok(data.update_stream_sink)
}
pub async fn delete(&self, id: &str) -> Result<bool, HivehookError> {
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
let data: DeleteData = self
.transport
.execute(
"mutation($id: UUID!) { deleteStreamSink(id: $id) }",
Some(v),
)
.await?;
Ok(data.delete_stream_sink)
}
}