// except according to those terms.
use std::borrow::Cow;
+use std::cmp::min;
use std::ops::{Add, Sub};
use Config;
pub alignment: usize,
}
-// INDENT_BUFFER.len() = 80
+// INDENT_BUFFER.len() = 81
const INDENT_BUFFER_LEN: usize = 80;
const INDENT_BUFFER: &str =
- "\n ";
+ "\n ";
+
impl Indent {
pub fn new(block_indent: usize, alignment: usize) -> Indent {
Indent {
};
let num_chars = num_tabs + num_spaces;
if num_tabs == 0 && num_chars + offset <= INDENT_BUFFER_LEN {
- Cow::from(&INDENT_BUFFER[offset..num_chars + 1])
+ Cow::from(&INDENT_BUFFER[offset..=num_chars])
} else {
let mut indent = String::with_capacity(num_chars + if offset == 0 { 1 } else { 0 });
if offset == 0 {
pub fn indented(indent: Indent, config: &Config) -> Shape {
Shape {
- width: config.max_width().checked_sub(indent.width()).unwrap_or(0),
+ width: config.max_width().saturating_sub(indent.width()),
indent,
offset: indent.alignment,
}
pub fn with_max_width(&self, config: &Config) -> Shape {
Shape {
- width: config
- .max_width()
- .checked_sub(self.indent.width())
- .unwrap_or(0),
+ width: config.max_width().saturating_sub(self.indent.width()),
..*self
}
}
- pub fn offset(width: usize, indent: Indent, offset: usize) -> Shape {
- Shape {
- width,
- indent,
- offset,
- }
- }
-
pub fn visual_indent(&self, extra_width: usize) -> Shape {
let alignment = self.offset + extra_width;
Shape {
pub fn rhs_overhead(&self, config: &Config) -> usize {
config
.max_width()
- .checked_sub(self.used_width() + self.width)
- .unwrap_or(0)
+ .saturating_sub(self.used_width() + self.width)
+ }
+
+ pub fn comment(&self, config: &Config) -> Shape {
+ let width = min(
+ self.width,
+ config.comment_width().saturating_sub(self.indent.width()),
+ );
+ Shape { width, ..*self }
+ }
+
+ pub fn to_string_with_newline(&self, config: &Config) -> Cow<'static, str> {
+ let mut offset_indent = self.indent;
+ offset_indent.alignment = self.offset;
+ offset_indent.to_string_inner(config, 0)
}
}