use crate::diff::diff_output::DiffOutput;
use crate::diff::types::DiffOutputMarker;
use colored::{ColoredString, Colorize};
use std::fmt::Display;
#[derive(Clone)]
pub enum SequenceSource {
First,
Second,
}
impl Display for SequenceSource {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::First => write!(f, "first"),
Self::Second => write!(f, "second"),
}
}
}
#[derive(Clone)]
pub struct SequenceCountDiff(i64, i64);
impl SequenceCountDiff {
pub fn new(first: i64, second: i64) -> Self {
Self(first, second)
}
pub fn first(&self) -> i64 {
self.0
}
pub fn second(&self) -> i64 {
self.1
}
}
#[derive(Clone)]
pub enum SequenceDiffOutput {
NoDiff(String),
NotExists(String, SequenceSource),
Diff(String, SequenceCountDiff),
}
impl SequenceDiffOutput {
pub fn to_string(&self) -> ColoredString {
match self {
Self::NoDiff(sequence) => format!("{} - No difference\n", sequence).green().bold(),
Self::NotExists(sequence, source) => {
format!("{} - Does not exist in {}\n", sequence, source)
.red()
.bold()
.underline()
}
Self::Diff(sequence, diffs) => format!(
"Difference in sequence:{} - First: {}, Second: {}\n",
sequence,
diffs.first(),
diffs.second()
)
.red()
.bold()
.underline(),
}
}
}
impl DiffOutputMarker for SequenceDiffOutput {
fn convert(self) -> DiffOutput {
DiffOutput::SequenceDiff(self.clone())
}
}
impl From<SequenceDiffOutput> for DiffOutput {
fn from(val: SequenceDiffOutput) -> Self {
DiffOutput::SequenceDiff(val)
}
}