use crate::{NoopProgress, ProgressReporter};
use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
use std::fmt;
use std::sync::Arc;
pub type Metadata = Map<String, Value>;
#[non_exhaustive]
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct HealthResponse {
pub status: String,
}
#[non_exhaustive]
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Stream {
pub id: i32,
pub name: String,
#[serde(rename = "type")]
pub stream_type: StreamType,
pub datapool: String,
#[serde(default, deserialize_with = "deserialize_default_string")]
pub description: String,
#[serde(default)]
pub n_datasets: Option<u64>,
#[serde(default)]
pub n_datapoints: Option<u64>,
#[serde(default)]
pub cold_bytes: Option<u64>,
#[serde(default)]
pub hot_bytes: Option<u64>,
#[serde(default)]
pub plugin: Option<String>,
#[serde(default)]
pub plugin_args: Option<String>,
#[serde(flatten)]
pub extra: Value,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum StreamType {
Files,
Realtime,
}
fn deserialize_default_string<'de, D>(deserializer: D) -> std::result::Result<String, D::Error>
where
D: serde::Deserializer<'de>,
{
Ok(Option::<String>::deserialize(deserializer)?.unwrap_or_default())
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum ImportStatus {
Uploading,
Waiting,
Importing,
Postprocessing,
PostprocessingFailed,
Finished,
Live,
Failed,
}
#[non_exhaustive]
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Dataset {
pub id: i32,
pub datastream_id: i32,
pub datastream_version: Option<i32>,
pub created_at: f64,
pub created_by: Option<String>,
pub import_status: ImportStatus,
pub import_progress: Option<f64>,
pub import_message: Option<String>,
pub import_time: Option<f64>,
pub path: String,
pub metadata: Metadata,
pub cold_path: Option<String>,
pub cold_bytes: Option<u64>,
pub hot_bytes: Option<u64>,
pub backup_path: Option<String>,
pub backup_size: Option<u64>,
pub plugin: Option<String>,
pub plugin_args: Option<String>,
pub n_datapoints: Option<u64>,
pub n_signals: Option<u64>,
pub timestamp_start: Option<f64>,
pub timestamp_stop: Option<f64>,
pub import_speed: Option<f64>,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug)]
pub enum UploadModeOverride {
Auto,
Server,
}
#[non_exhaustive]
pub struct PushFileOptions {
pub(crate) metadata: Metadata,
pub(crate) concurrency: usize,
pub(crate) upload_mode: UploadModeOverride,
pub(crate) progress: Arc<dyn ProgressReporter>,
}
impl fmt::Debug for PushFileOptions {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("PushFileOptions")
.field("metadata", &self.metadata)
.field("concurrency", &self.concurrency)
.field("upload_mode", &self.upload_mode)
.finish_non_exhaustive()
}
}
impl PushFileOptions {
pub fn builder() -> PushFileOptionsBuilder {
PushFileOptionsBuilder::default()
}
}
impl Default for PushFileOptions {
fn default() -> Self {
Self {
metadata: Default::default(),
concurrency: 4,
upload_mode: UploadModeOverride::Auto,
progress: Arc::new(NoopProgress),
}
}
}
#[non_exhaustive]
#[derive(Clone)]
pub struct PushFileOptionsBuilder {
metadata: Metadata,
concurrency: usize,
upload_mode: UploadModeOverride,
progress: Arc<dyn ProgressReporter>,
}
impl fmt::Debug for PushFileOptionsBuilder {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("PushFileOptionsBuilder")
.field("metadata", &self.metadata)
.field("concurrency", &self.concurrency)
.field("upload_mode", &self.upload_mode)
.finish_non_exhaustive()
}
}
impl Default for PushFileOptionsBuilder {
fn default() -> Self {
let options = PushFileOptions::default();
Self {
metadata: options.metadata,
concurrency: options.concurrency,
upload_mode: options.upload_mode,
progress: options.progress,
}
}
}
impl PushFileOptionsBuilder {
pub fn metadata<I, K, V>(mut self, entries: I) -> Self
where
I: IntoIterator<Item = (K, V)>,
K: Into<String>,
V: Into<Value>,
{
self.metadata = entries
.into_iter()
.map(|(key, value)| (key.into(), value.into()))
.collect();
self
}
pub fn concurrency(mut self, concurrency: usize) -> Self {
self.concurrency = concurrency;
self
}
pub fn upload_mode(mut self, upload_mode: UploadModeOverride) -> Self {
self.upload_mode = upload_mode;
self
}
pub fn progress(mut self, progress: Arc<dyn ProgressReporter>) -> Self {
self.progress = progress;
self
}
pub fn build(self) -> PushFileOptions {
PushFileOptions {
metadata: self.metadata,
concurrency: self.concurrency,
upload_mode: self.upload_mode,
progress: self.progress,
}
}
}
#[derive(Debug, Serialize, Deserialize)]
pub(crate) struct StreamsResponse {
pub(crate) streams: Vec<Stream>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "lowercase")]
pub(crate) enum UploadMode {
Server,
Azure,
Single,
Multipart,
}
#[derive(Debug, Deserialize)]
pub(crate) struct IngestionInit {
pub(crate) dataset_id: i32,
pub(crate) ingestion_id: i32,
pub(crate) mode: UploadMode,
pub(crate) presigned_url: Option<String>,
pub(crate) part_size: Option<u64>,
#[serde(rename = "expires_in")]
pub(crate) _expires_in: u64,
}
#[derive(Debug, Deserialize)]
pub(crate) struct PartUrl {
pub(crate) part_number: u32,
pub(crate) url: String,
}
#[derive(Debug, Deserialize)]
pub(crate) struct PartUrlsResponse {
pub(crate) parts: Vec<PartUrl>,
#[serde(rename = "expires_in")]
pub(crate) _expires_in: u64,
pub(crate) next_part: Option<u32>,
}