#![allow(unused)]
use std::{fmt, str::FromStr};
use cargo_metadata::semver;
use serde::{Deserialize, Serialize};
#[derive(
Default, Clone, Copy, Debug, Hash, PartialOrd, Ord, Eq, PartialEq, Serialize, Deserialize,
)]
pub enum Edition {
#[default]
Edition2015,
Edition2018,
Edition2021,
Edition2024,
}
impl Edition {
pub const LATEST_UNSTABLE: Option<Edition> = Some(Edition::Edition2024);
pub const LATEST_STABLE: Edition = Edition::Edition2021;
pub const ALL: &'static [Edition] = &[
Self::Edition2015,
Self::Edition2018,
Self::Edition2021,
Self::Edition2024,
];
pub const CLI_VALUES: [&'static str; 4] = ["2015", "2018", "2021", "2024"];
pub(crate) fn first_version(&self) -> Option<semver::Version> {
use Edition::*;
match self {
Edition2015 => None,
Edition2018 => Some(semver::Version::new(1, 31, 0)),
Edition2021 => Some(semver::Version::new(1, 56, 0)),
Edition2024 => None,
}
}
pub fn is_stable(&self) -> bool {
use Edition::*;
match self {
Edition2015 => true,
Edition2018 => true,
Edition2021 => true,
Edition2024 => false,
}
}
pub fn previous(&self) -> Option<Edition> {
use Edition::*;
match self {
Edition2015 => None,
Edition2018 => Some(Edition2015),
Edition2021 => Some(Edition2018),
Edition2024 => Some(Edition2021),
}
}
pub fn saturating_next(&self) -> Edition {
use Edition::*;
match self {
Edition2015 => Edition2018,
Edition2018 => Edition2021,
Edition2021 => Edition2024,
Edition2024 => Edition2024,
}
}
pub(crate) fn supports_compat_lint(&self) -> bool {
use Edition::*;
match self {
Edition2015 => false,
Edition2018 => true,
Edition2021 => true,
Edition2024 => true,
}
}
pub(crate) fn supports_idiom_lint(&self) -> bool {
use Edition::*;
match self {
Edition2015 => false,
Edition2018 => true,
Edition2021 => false,
Edition2024 => false,
}
}
}
impl fmt::Display for Edition {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
Edition::Edition2015 => f.write_str("2015"),
Edition::Edition2018 => f.write_str("2018"),
Edition::Edition2021 => f.write_str("2021"),
Edition::Edition2024 => f.write_str("2024"),
}
}
}
impl FromStr for Edition {
type Err = anyhow::Error;
fn from_str(s: &str) -> Result<Self, anyhow::Error> {
match s {
"2015" => Ok(Edition::Edition2015),
"2018" => Ok(Edition::Edition2018),
"2021" => Ok(Edition::Edition2021),
"2024" => Ok(Edition::Edition2024),
s if s.parse().map_or(false, |y: u16| y > 2024 && y < 2050) => anyhow::bail!(
"this version of Cargo is older than the `{}` edition, \
and only supports `2015`, `2018`, `2021`, and `2024` editions.",
s
),
s => anyhow::bail!(
"supported edition values are `2015`, `2018`, `2021`, or `2024`, \
but `{}` is unknown",
s
),
}
}
}