1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
use std::str::CharIndices;
use std::io::Result as IoResult;
use std::io::Write;
use super::action::{IFlagAction, ParseResult};
use super::action::ParseResult::Help;
pub struct HelpAction;
impl IFlagAction for HelpAction {
fn parse_flag(&self) -> ParseResult {
return Help;
}
}
struct WordsIter<'a> {
data: &'a str,
iter: CharIndices<'a>,
}
impl<'a> WordsIter<'a> {
fn new(data: &'a str) -> WordsIter<'a> {
return WordsIter {
data: data,
iter: data.char_indices(),
};
}
}
impl<'a> Iterator for WordsIter<'a> {
type Item = &'a str;
fn next(&mut self) -> Option<&'a str> {
let word_start;
loop {
let (idx, ch) = match self.iter.next() {
None => return None,
Some((idx, ch)) => ((idx, ch)),
};
match ch {
' ' | '\t' | '\r' | '\n' => continue,
_ => {
word_start = idx;
break;
}
}
}
loop {
let (idx, ch) = match self.iter.next() {
None => break,
Some((idx, ch)) => ((idx, ch)),
};
match ch {
' ' | '\t' | '\r' | '\n' => {
return Some(&self.data[word_start..idx]);
}
_ => continue,
}
}
return Some(&self.data[word_start..self.data.len()]);
}
}
pub fn wrap_text(buf: &mut Write, data: &str, width: usize, indent: usize)
-> IoResult<()>
{
let mut witer = WordsIter::new(data);
let mut off = indent;
match witer.next() {
None => {
return Ok(());
}
Some(word) => {
try!(buf.write(word.as_bytes()));
off += word.len();
}
}
for word in witer {
if off + word.len() + 1 > width {
try!(buf.write(b"\n"));
for _ in 0..indent {
try!(buf.write(b" "));
}
off = indent;
} else {
try!(buf.write(b" "));
off += 1;
}
try!(buf.write(word.as_bytes()));
off += word.len();
}
return Ok(());
}
|