use crate::{
config::user_opts::HeuristicsOptions,
constants::{
DEFAULT_ATTR_FN_LIKE_WIDTH, DEFAULT_CHAIN_WIDTH, DEFAULT_COLLECTION_WIDTH,
DEFAULT_FN_CALL_WIDTH, DEFAULT_MAX_LINE_WIDTH, DEFAULT_SINGLE_LINE_IF_ELSE_WIDTH,
DEFAULT_STRUCTURE_LIT_WIDTH, DEFAULT_STRUCTURE_VAR_WIDTH,
},
};
use serde::{Deserialize, Serialize};
#[derive(Debug, Copy, Clone)]
pub struct Heuristics {
pub heuristics_pref: HeuristicsPreferences,
pub use_small_heuristics: bool,
}
impl Default for Heuristics {
fn default() -> Self {
Self {
heuristics_pref: HeuristicsPreferences::Scaled,
use_small_heuristics: true,
}
}
}
impl Heuristics {
pub fn from_opts(opts: &HeuristicsOptions) -> Self {
let default = Self::default();
Self {
heuristics_pref: opts.heuristics_pref.unwrap_or(default.heuristics_pref),
use_small_heuristics: opts
.use_small_heuristics
.unwrap_or(default.use_small_heuristics),
}
}
}
#[derive(Serialize, Deserialize, Debug, Copy, Clone)]
pub enum HeuristicsPreferences {
Off,
Max,
Scaled,
}
impl HeuristicsPreferences {
pub fn to_width_heuristics(self, max_width: usize) -> WidthHeuristics {
match self {
HeuristicsPreferences::Off => WidthHeuristics::off(),
HeuristicsPreferences::Max => WidthHeuristics::max(max_width),
HeuristicsPreferences::Scaled => WidthHeuristics::scaled(max_width),
}
}
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Copy)]
pub struct WidthHeuristics {
pub(crate) fn_call_width: usize,
pub(crate) attr_fn_like_width: usize,
pub(crate) structure_lit_width: usize,
pub(crate) structure_field_width: usize,
pub(crate) collection_width: usize,
pub(crate) chain_width: usize,
pub(crate) single_line_if_else_max_width: usize,
}
impl WidthHeuristics {
pub fn off() -> WidthHeuristics {
WidthHeuristics {
fn_call_width: usize::max_value(),
attr_fn_like_width: usize::max_value(),
structure_lit_width: 0,
structure_field_width: 0,
collection_width: usize::max_value(),
chain_width: usize::max_value(),
single_line_if_else_max_width: 0,
}
}
pub fn max(max_width: usize) -> WidthHeuristics {
WidthHeuristics {
fn_call_width: max_width,
attr_fn_like_width: max_width,
structure_lit_width: max_width,
structure_field_width: max_width,
collection_width: max_width,
chain_width: max_width,
single_line_if_else_max_width: max_width,
}
}
pub fn scaled(max_width: usize) -> WidthHeuristics {
let max_width_ratio = if max_width > DEFAULT_MAX_LINE_WIDTH {
let ratio = max_width as f32 / DEFAULT_MAX_LINE_WIDTH as f32;
(ratio * 10.0).round() / 10.0
} else {
1.0
};
WidthHeuristics {
fn_call_width: (DEFAULT_FN_CALL_WIDTH as f32 * max_width_ratio).round() as usize,
attr_fn_like_width: (DEFAULT_ATTR_FN_LIKE_WIDTH as f32 * max_width_ratio).round()
as usize,
structure_lit_width: (DEFAULT_STRUCTURE_LIT_WIDTH as f32 * max_width_ratio).round()
as usize,
structure_field_width: (DEFAULT_STRUCTURE_VAR_WIDTH as f32 * max_width_ratio).round()
as usize,
collection_width: (DEFAULT_COLLECTION_WIDTH as f32 * max_width_ratio).round() as usize,
chain_width: (DEFAULT_CHAIN_WIDTH as f32 * max_width_ratio).round() as usize,
single_line_if_else_max_width: (DEFAULT_SINGLE_LINE_IF_ELSE_WIDTH as f32
* max_width_ratio)
.round() as usize,
}
}
}
impl Default for WidthHeuristics {
fn default() -> Self {
Self::scaled(100)
}
}