use core::fmt;
use std::collections::BTreeSet;
use std::ops::{Range, RangeInclusive};
use std::str::FromStr;
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use crate::VersionedSplitMetadataDeserializeHelper;
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct Split {
pub split_state: SplitState,
pub update_timestamp: i64,
#[serde(flatten)]
pub split_metadata: SplitMetadata,
}
impl Split {
pub fn split_id(&self) -> &str {
&self.split_metadata.split_id
}
}
#[derive(Clone, Eq, PartialEq, Default, Debug, Serialize)]
#[serde(into = "VersionedSplitMetadataDeserializeHelper")]
pub struct SplitMetadata {
pub split_id: String,
pub num_docs: usize,
pub original_size_in_bytes: u64,
pub time_range: Option<RangeInclusive<i64>>,
#[serde(default = "utc_now_timestamp")]
pub create_timestamp: i64,
#[serde(default)]
pub tags: BTreeSet<String>,
#[serde(default)]
pub demux_num_ops: usize,
pub footer_offsets: Range<u64>,
}
impl SplitMetadata {
pub fn new(split_id: String) -> Self {
Self {
split_id,
num_docs: 0,
original_size_in_bytes: 0,
time_range: None,
create_timestamp: utc_now_timestamp(),
tags: Default::default(),
demux_num_ops: 0,
footer_offsets: Default::default(),
}
}
pub fn split_id(&self) -> &str {
&self.split_id
}
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub enum SplitState {
Staged,
Published,
MarkedForDeletion,
}
impl FromStr for SplitState {
type Err = String;
fn from_str(input: &str) -> Result<SplitState, Self::Err> {
let split_state = match input {
"Staged" => SplitState::Staged,
"Published" => SplitState::Published,
"MarkedForDeletion" => SplitState::MarkedForDeletion,
"ScheduledForDeletion" => SplitState::MarkedForDeletion, "New" => SplitState::Staged, _ => return Err(format!("Unknown split state `{}`.", input)),
};
Ok(split_state)
}
}
impl fmt::Display for SplitState {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
pub fn utc_now_timestamp() -> i64 {
if cfg!(any(test, feature = "testsuite")) {
1640577000
} else {
OffsetDateTime::now_utc().unix_timestamp()
}
}