use crate::data::{
Attachment, DataError, Statement, StatementId, StatementResult, StatementResultId,
ValidationError,
};
use chrono::{DateTime, Utc};
use serde::Serialize;
use tracing::error;
#[derive(Debug, Serialize)]
#[serde(untagged)]
pub(crate) enum StatementType {
S(Box<Statement>),
SId(Box<StatementId>),
SR(StatementResult),
SRId(StatementResultId),
}
impl StatementType {
pub fn set_more(&mut self, val: &str) -> Result<(), DataError> {
match self {
StatementType::SR(x) => x.set_more(val),
StatementType::SRId(x) => x.set_more(val),
_ => {
let msg = "Not a Statement variant";
error!("{}", msg);
Err(DataError::Validation(ValidationError::ConstraintViolation(
msg.into(),
)))
}
}
}
pub fn is_empty(&self) -> bool {
match self {
StatementType::SR(x) => x.is_empty(),
StatementType::SRId(x) => x.is_empty(),
_ => false,
}
}
pub fn stored(&self) -> DateTime<Utc> {
match self {
StatementType::S(x) => x.stored().map_or(DateTime::UNIX_EPOCH, |x| *x),
StatementType::SId(x) => x.stored().map_or(DateTime::UNIX_EPOCH, |x| *x),
StatementType::SR(x) => {
let mut stored = DateTime::UNIX_EPOCH;
for s in x.statements() {
let ts = s.stored().map_or(&DateTime::UNIX_EPOCH, |x| x);
if ts > &stored {
stored = *ts
};
}
stored
}
StatementType::SRId(x) => {
let mut stored = DateTime::UNIX_EPOCH;
for s in x.statements() {
let ts = s.stored().map_or(&DateTime::UNIX_EPOCH, |x| x);
if ts > &stored {
stored = *ts
};
}
stored
}
}
}
pub fn attachments(&self) -> Vec<Attachment> {
match self {
StatementType::S(x) => x.attachments().to_vec(),
StatementType::SId(x) => x.attachments().to_vec(),
StatementType::SR(x) => {
let mut v = vec![];
for s in x.statements() {
v.extend_from_slice(s.attachments());
}
v
}
StatementType::SRId(x) => {
let mut v = vec![];
for s in x.statements() {
v.extend_from_slice(s.attachments());
}
v
}
}
}
}