#[cfg(feature = "json")]
use serde;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "json", derive(serde::Serialize, serde::Deserialize))]
pub enum MetaStatus {
Clean,
Migrating,
Failed,
}
impl Default for MetaStatus {
fn default() -> Self {
Self::Clean
}
}
pub trait Metadata {
fn version(&self) -> i32;
fn version_mut(&mut self) -> &mut i32;
fn app_version(&self) -> &str;
fn app_version_mut(&mut self) -> &mut String;
fn status(&self) -> MetaStatus;
fn status_mut(&mut self) -> &mut MetaStatus;
fn created_at(&self) -> &str;
fn created_at_mut(&mut self) -> &mut String;
fn updated_at(&self) -> &str;
fn updated_at_mut(&mut self) -> &mut String;
fn to_status_str(&self) -> &str {
match self.status() {
MetaStatus::Clean => "Clean",
MetaStatus::Migrating => "Migrating",
MetaStatus::Failed => "Failed",
}
}
fn touch_updated(&mut self) {
*self.updated_at_mut() = chrono::Utc::now().to_rfc3339();
}
fn set_version(&mut self, v: i32) {
*self.version_mut() = v;
self.touch_updated();
}
fn set_app_version(&mut self, v: String) {
*self.app_version_mut() = v;
self.touch_updated();
}
fn set_status(&mut self, s: MetaStatus) {
*self.status_mut() = s;
self.touch_updated();
}
fn mark_clean(&mut self) {
self.set_status(MetaStatus::Clean);
}
fn mark_migrating(&mut self) {
self.set_status(MetaStatus::Migrating);
}
fn mark_failed(&mut self) {
self.set_status(MetaStatus::Failed);
}
}