Skip to content

Commit

Permalink
Add StyleEdition enum and StyleEditionDefault triat
Browse files Browse the repository at this point in the history
**Note** This does not add the `style_edition` config option to rustfmt.
The `StyleEdition` enum will eventually be used to allow users to
configure the `style_edition`, but for now it's added so we can
introduce the the `StyleEditionDefault` trait.
  • Loading branch information
ytmimi committed Oct 6, 2023
1 parent d7669b4 commit 3d8a56a
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ pub(crate) mod file_lines;
#[allow(unreachable_pub)]
pub(crate) mod lists;
pub(crate) mod macro_names;
pub(crate) mod style_edition;

// This macro defines configuration options used in rustfmt. Each option
// is defined as follows:
Expand Down
24 changes: 24 additions & 0 deletions src/config/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -468,3 +468,27 @@ pub enum MatchArmLeadingPipe {
/// Preserve any existing leading pipes
Preserve,
}

/// Defines the default values for each config according to [the style guide].
/// rustfmt output may differ between style editions.
///
/// [the style guide]: https://doc.rust-lang.org/nightly/style-guide/
#[config_type]
pub enum StyleEdition {
#[value = "2015"]
#[doc_hint = "2015"]
/// [Edition 2015]()
Edition2015,
#[value = "2018"]
#[doc_hint = "2018"]
/// [Edition 2018]()
Edition2018,
#[value = "2021"]
#[doc_hint = "2021"]
/// [Edition 2021]()
Edition2021,
#[value = "2024"]
#[doc_hint = "2024"]
/// [Edition 2024]().
Edition2024,
}
69 changes: 69 additions & 0 deletions src/config/style_edition.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
use crate::config::StyleEdition;

/// Defines the default value for the given style edition
pub(crate) trait StyleEditionDefault {
type ConfigType;
fn style_edition_default(style_edition: StyleEdition) -> Self::ConfigType;
}

/// macro to help implement `StyleEditionDefault` for config options
#[macro_export]
macro_rules! style_edition_default {
($ty:ident, $config_ty:ty, $default:expr) => {
impl crate::config::style_edition::StyleEditionDefault for $ty {
type ConfigType = $config_ty;

fn style_edition_default(_: crate::config::StyleEdition) -> Self::ConfigType {
$default
}
}
};
($ty:ident, $config_ty:ty, $default_2015:expr, $default_2024:expr) => {
impl crate::config::style_edition::StyleEditionDefault for $ty {
type ConfigType = $config_ty;

fn style_edition_default(
style_edition: crate::config::StyleEdition,
) -> Self::ConfigType {
match style_edition {
crate::config::StyleEdition::Edition2015
| crate::config::StyleEdition::Edition2018
| crate::config::StyleEdition::Edition2021 => $default_2015,
crate::config::StyleEdition::Edition2024 => $default_2024,
}
}
}
};
}

#[cfg(test)]
mod test {
use super::*;
use crate::config::StyleEdition;

#[test]
fn test_impl_default_style_edition_struct_for_all_editions() {
struct Unit;
style_edition_default!(Unit, usize, 100);

// regardless of the style edition used the value will always return 100
assert_eq!(Unit::style_edition_default(StyleEdition::Edition2015), 100);
assert_eq!(Unit::style_edition_default(StyleEdition::Edition2018), 100);
assert_eq!(Unit::style_edition_default(StyleEdition::Edition2021), 100);
assert_eq!(Unit::style_edition_default(StyleEdition::Edition2024), 100);
}

#[test]
fn test_impl_default_style_edition_for_old_and_new_editions() {
struct Unit;
style_edition_default!(Unit, usize, 100, 50);

// style edition 2015-2021 are all the same
assert_eq!(Unit::style_edition_default(StyleEdition::Edition2015), 100);
assert_eq!(Unit::style_edition_default(StyleEdition::Edition2018), 100);
assert_eq!(Unit::style_edition_default(StyleEdition::Edition2021), 100);

// style edition 2014
assert_eq!(Unit::style_edition_default(StyleEdition::Edition2024), 50);
}
}

0 comments on commit 3d8a56a

Please sign in to comment.