use std::cmp::Ordering;
#[derive(Clone, Debug)]
pub enum InstanceState {
Unknown,
Valid(ValidInstance),
Invalid(InvalidInstance),
Suspect(SuspectInstance),
}
impl InstanceState {
#[cfg(test)]
pub fn valid(state: ValidInstance) -> Self {
InstanceState::Valid(state)
}
#[cfg(test)]
pub fn suspect(state: SuspectInstance) -> Self {
InstanceState::Suspect(state)
}
#[cfg(test)]
pub fn fixable(state: FixableInstance) -> Self {
InstanceState::Invalid(InvalidInstance::Fixable(state))
}
#[cfg(test)]
pub fn conflict(state: SemverGroupAndVersionConflict) -> Self {
InstanceState::Invalid(InvalidInstance::Conflict(state))
}
#[cfg(test)]
pub fn unfixable(state: UnfixableInstance) -> Self {
InstanceState::Invalid(InvalidInstance::Unfixable(state))
}
pub fn get_name(&self) -> String {
match self {
InstanceState::Unknown => "Unknown".to_string(),
InstanceState::Valid(variant) => format!("{variant:?}"),
InstanceState::Invalid(variant) => match variant {
InvalidInstance::Fixable(variant) => format!("{variant:?}"),
InvalidInstance::Conflict(variant) => format!("{variant:?}"),
InvalidInstance::Unfixable(variant) => format!("{variant:?}"),
},
InstanceState::Suspect(variant) => format!("{variant:?}"),
}
}
pub fn get_severity(&self) -> u8 {
match self {
InstanceState::Unknown => 0,
InstanceState::Valid(_) => 1,
InstanceState::Invalid(_) => 2,
InstanceState::Suspect(_) => 3,
}
}
pub fn is_valid(&self) -> bool {
matches!(self, InstanceState::Valid(_))
}
pub fn is_invalid(&self) -> bool {
matches!(self, InstanceState::Invalid(_))
}
pub fn is_suspect(&self) -> bool {
matches!(self, InstanceState::Suspect(_))
}
pub fn is_fixable(&self) -> bool {
matches!(self, InstanceState::Invalid(InvalidInstance::Fixable(_)))
}
pub fn is_banned(&self) -> bool {
matches!(self, InstanceState::Invalid(InvalidInstance::Fixable(FixableInstance::IsBanned)))
}
pub fn is_unfixable(&self) -> bool {
matches!(self, InstanceState::Invalid(InvalidInstance::Unfixable(_)))
}
pub fn is_outdated(&self) -> bool {
matches!(
self,
InstanceState::Invalid(InvalidInstance::Fixable(FixableInstance::DiffersToNpmRegistry))
)
}
}
impl PartialEq for InstanceState {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(InstanceState::Unknown, InstanceState::Unknown) => true,
(InstanceState::Valid(a), InstanceState::Valid(b)) => a == b,
(InstanceState::Invalid(a), InstanceState::Invalid(b)) => a == b,
(InstanceState::Suspect(a), InstanceState::Suspect(b)) => a == b,
_ => false,
}
}
}
impl Eq for InstanceState {}
impl PartialOrd for InstanceState {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for InstanceState {
fn cmp(&self, other: &Self) -> Ordering {
self.get_severity().cmp(&other.get_severity())
}
}
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub enum ValidInstance {
IsCatalog,
IsIgnored,
IsLocalAndValid,
IsIdenticalToLocal,
SatisfiesLocal,
IsHighestOrLowestSemver,
SatisfiesHighestOrLowestSemver,
IsNonSemverButIdentical,
IsIdenticalToPin,
SatisfiesSameRangeGroup,
SatisfiesSameMinorGroup,
IsIdenticalToSnapTarget,
SatisfiesSnapTarget,
}
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub enum InvalidInstance {
Fixable(FixableInstance),
Unfixable(UnfixableInstance),
Conflict(SemverGroupAndVersionConflict),
}
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub enum FixableInstance {
IsBanned,
DiffersToCatalog,
DiffersToLocal,
DiffersToHighestOrLowestSemver,
DiffersToNpmRegistry,
DiffersToSnapTarget,
DiffersToPin,
SemverRangeMismatch,
PinOverridesSemverRange,
PinOverridesSemverRangeMismatch,
SameMinorOverridesSemverRange,
SameMinorOverridesSemverRangeMismatch,
}
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub enum UnfixableInstance {
DependsOnInvalidLocalPackage,
NonSemverMismatch,
SameRangeMismatch,
SameMinorMismatch,
}
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub enum SemverGroupAndVersionConflict {
MatchConflictsWithHighestOrLowestSemver,
MismatchConflictsWithHighestOrLowestSemver,
MatchConflictsWithSnapTarget,
MismatchConflictsWithSnapTarget,
MatchConflictsWithLocal,
MismatchConflictsWithLocal,
}
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub enum SuspectInstance {
RefuseToBanLocal,
RefuseToPinLocal,
RefuseToSnapLocal,
InvalidLocalVersion,
DependsOnMissingSnapTarget,
}