use semver::Version;
use crate::version::VersionSet;
#[derive(Debug, Clone)]
pub enum Constraint {
Dependency {
package: String,
version_set: VersionSet,
dependent: Option<String>,
},
Conflict {
package1: String,
version1: Version,
package2: String,
version2: Version,
},
AtMostOne {
package: String,
versions: Vec<Version>,
},
AtLeastOne {
package: String,
versions: Vec<Version>,
},
Exactly { package: String, version: Version },
Exclude { package: String, version: Version },
Implies {
premise_package: String,
premise_version: Version,
conclusion_package: String,
conclusion_version_set: VersionSet,
},
OptionalDependency {
package: String,
version_set: VersionSet,
dependent: Option<String>,
condition: Option<String>,
},
ConditionalDependency {
package: String,
version_set: VersionSet,
dependent: Option<String>,
condition: String,
},
}
impl Constraint {
pub fn dependency(package: String, version_set: VersionSet, dependent: Option<String>) -> Self {
Self::Dependency {
package,
version_set,
dependent,
}
}
pub fn optional_dependency(
package: String,
version_set: VersionSet,
dependent: Option<String>,
condition: Option<String>,
) -> Self {
Self::OptionalDependency {
package,
version_set,
dependent,
condition,
}
}
pub fn conditional_dependency(
package: String,
version_set: VersionSet,
dependent: Option<String>,
condition: String,
) -> Self {
Self::ConditionalDependency {
package,
version_set,
dependent,
condition,
}
}
pub fn primary_package(&self) -> Option<&str> {
match self {
Self::Dependency { package, .. }
| Self::AtMostOne { package, .. }
| Self::AtLeastOne { package, .. }
| Self::Exactly { package, .. }
| Self::Exclude { package, .. }
| Self::OptionalDependency { package, .. }
| Self::ConditionalDependency { package, .. } => Some(package),
Self::Conflict { package1, .. } => Some(package1),
Self::Implies {
premise_package, ..
} => Some(premise_package),
}
}
pub fn is_optional(&self) -> bool {
matches!(self, Self::OptionalDependency { .. })
}
pub fn is_conditional(&self) -> bool {
matches!(self, Self::ConditionalDependency { .. })
}
}