#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub(super) enum Style {
SingleGroup,
#[default]
Grouped,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub(super) enum Group {
Std,
Internal,
Thirdparty,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub(super) enum CfgBlockHandling {
#[default]
Trailing,
Merge,
}
#[derive(Debug, serde::Deserialize)]
#[serde(default, deny_unknown_fields, rename_all = "snake_case")]
pub(super) struct Config {
pub(super) style: Style,
pub(super) order: Vec<Group>,
pub(super) std_crates: Vec<String>,
pub(super) internal_prefixes: Vec<String>,
pub(super) cfg_block_handling: CfgBlockHandling,
pub(super) blank_line_count: usize,
}
impl Default for Config {
fn default() -> Self {
Self {
style: Style::default(),
order: vec![Group::Std, Group::Internal, Group::Thirdparty],
std_crates: ["std", "core", "alloc"]
.into_iter()
.map(ToOwned::to_owned)
.collect(),
internal_prefixes: ["crate", "super", "self"]
.into_iter()
.map(ToOwned::to_owned)
.collect(),
cfg_block_handling: CfgBlockHandling::default(),
blank_line_count: 1,
}
}
}
impl Config {
pub(super) fn group_rank(&self, group: Group) -> usize {
self.order
.iter()
.position(|listed| *listed == group)
.unwrap_or(self.order.len())
}
pub(super) fn cfg_rank(&self) -> usize {
self.order.len() + 1
}
}