use uv_static::EnvVars;
fn should_wrap_lines() -> bool {
std::env::var_os(EnvVars::UV_NO_WRAP).is_none()
}
pub(crate) fn get_wrap_width(width_override: Option<usize>) -> Option<usize> {
if !should_wrap_lines() {
return None;
}
if let Some(width) = width_override {
return Some(width);
}
if let Ok(cols) = std::env::var(EnvVars::COLUMNS) {
if let Ok(width) = cols.parse::<usize>() {
return Some(width);
}
}
if let Some((terminal_size::Width(width), _)) = terminal_size::terminal_size() {
return Some(width as usize);
}
None
}
pub(crate) fn wrap_text(
text: &str,
width: Option<usize>,
initial_indent: &str,
subsequent_indent: &str,
) -> String {
let Some(width) = width else {
return format!("{initial_indent}{text}");
};
let options = textwrap::Options::new(width)
.initial_indent(initial_indent)
.subsequent_indent(subsequent_indent)
.break_words(false)
.word_separator(textwrap::WordSeparator::AsciiSpace)
.word_splitter(textwrap::WordSplitter::NoHyphenation);
let mut wrapped = String::with_capacity(text.len());
for (index, line) in text.split_terminator('\n').enumerate() {
if index > 0 {
wrapped.push('\n');
}
if line.is_empty() {
continue;
}
wrapped.push_str(&textwrap::fill(
line,
if index == 0 {
options.clone()
} else {
options.clone().initial_indent("")
},
));
}
wrapped
}