use serde::{Deserialize, Serialize};
use std::fmt;
use std::str::FromStr;
#[derive(
Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq, PartialOrd, Ord, Hash,
)]
#[serde(rename_all = "lowercase")]
pub enum Bump {
#[default]
None,
Patch,
Minor,
Major,
}
impl fmt::Display for Bump {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::None => "none",
Self::Patch => "patch",
Self::Minor => "minor",
Self::Major => "major",
})
}
}
impl FromStr for Bump {
type Err = String;
fn from_str(value: &str) -> std::result::Result<Self, Self::Err> {
match value {
"patch" => Ok(Self::Patch),
"minor" => Ok(Self::Minor),
"major" => Ok(Self::Major),
_ => Err(format!("expected major, minor, or patch; got {value}")),
}
}
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ProjectionMode {
Committed,
Injected,
None,
}
#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum Pre1BumpMapping {
Component,
#[default]
Compatibility,
}
#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ReleaseUnitDisposition {
#[default]
Managed,
Suspended,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum TagRole {
Primary,
Projection,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
pub enum TagPhase {
BeforePublication,
AfterPublication,
}
impl fmt::Display for TagPhase {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::BeforePublication => "before-publication",
Self::AfterPublication => "after-publication",
})
}
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "lowercase")]
pub enum Adapter {
Npm,
Cargo,
Pub,
Python,
Msbuild,
Go,
Json,
Toml,
Yaml,
}
impl Adapter {
pub fn requires_pointer(self) -> bool {
matches!(self, Self::Json | Self::Toml | Self::Yaml)
}
pub fn ecosystem(self) -> Option<&'static str> {
match self {
Self::Npm => Some("npm"),
Self::Cargo => Some("cargo"),
Self::Pub => Some("pub"),
Self::Python => Some("python"),
Self::Msbuild => Some("msbuild"),
Self::Go => Some("go"),
Self::Json | Self::Toml | Self::Yaml => None,
}
}
}