use core::fmt;
use std::fmt::{Display, Formatter};
use launchdarkly_server_sdk_evaluation::FlagValue;
use serde::{Deserialize, Serialize};
#[non_exhaustive]
#[derive(Debug, Copy, Clone, Serialize, Eq, Hash, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Origin {
Old,
New,
}
#[non_exhaustive]
#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Operation {
Read,
Write,
}
#[non_exhaustive]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Stage {
Off,
DualWrite,
Shadow,
Live,
Rampdown,
Complete,
}
impl Display for Stage {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
match self {
Stage::Off => write!(f, "off"),
Stage::DualWrite => write!(f, "dualwrite"),
Stage::Shadow => write!(f, "shadow"),
Stage::Live => write!(f, "live"),
Stage::Rampdown => write!(f, "rampdown"),
Stage::Complete => write!(f, "complete"),
}
}
}
impl From<Stage> for FlagValue {
fn from(stage: Stage) -> FlagValue {
FlagValue::Str(stage.to_string())
}
}
impl TryFrom<FlagValue> for Stage {
type Error = String;
fn try_from(value: FlagValue) -> Result<Self, Self::Error> {
if let FlagValue::Str(value) = value {
match value.as_str() {
"off" => Ok(Stage::Off),
"dualwrite" => Ok(Stage::DualWrite),
"shadow" => Ok(Stage::Shadow),
"live" => Ok(Stage::Live),
"rampdown" => Ok(Stage::Rampdown),
"complete" => Ok(Stage::Complete),
_ => Err(format!("Invalid stage: {value}")),
}
} else {
Err("Cannot convert non-string value to Stage".to_string())
}
}
}
#[non_exhaustive]
#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ExecutionOrder {
Serial,
Random,
Concurrent,
}
pub use migrator::Migrator;
pub use migrator::MigratorBuilder;
pub use tracker::MigrationOpTracker;
mod migrator;
mod tracker;