pub struct Res { pub count: usize, pub added: bool, pub removed: bool, pub value: String, } #[derive(PartialEq, Debug)] pub enum Mode { INIT, BOTH, LEFT, RIGHT, } fn get_line_res(s: &String, mode: Mode) -> Res { Res { count: s.split('\n').count(), added: if mode == Mode::RIGHT { true } else { false }, removed: if mode == Mode::LEFT { true } else { false }, value: s.clone(), } } fn get_res(s: &String, mode: Mode) -> Res { Res { count: s.chars().count(), added: if mode == Mode::RIGHT { true } else { false }, removed: if mode == Mode::LEFT { true } else { false }, value: s.clone(), } } pub fn diff_chars(s1: &str, s2: &str) -> Vec { let mut mode = Mode::INIT; let mut s: String = String::new(); let mut result: Vec = Vec::new(); for d in diff::chars(s1, s2) { match d { diff::Result::Left(l) => { if mode != Mode::LEFT && mode != Mode::INIT { result.push(get_res(&s, mode)); s.clear(); } mode = Mode::LEFT; s.push(l); } diff::Result::Right(r) => { if mode != Mode::RIGHT && mode != Mode::INIT { result.push(get_res(&s, mode)); s.clear(); } mode = Mode::RIGHT; s.push(r); } diff::Result::Both(l, _) => { if mode != Mode::BOTH && mode != Mode::INIT { result.push(get_res(&s, mode)); s.clear(); } mode = Mode::BOTH; s.push(l); } } } if s.len() > 0 { result.push(get_res(&s, mode)); s.clear(); } result } pub fn diff_lines(s1: &str, s2: &str) -> Vec { let mut result: Vec = Vec::new(); let mut mode = Mode::INIT; let mut s: String = String::new(); for d in diff::lines(s1, s2) { match d { diff::Result::Left(l) => { if mode != Mode::LEFT && mode != Mode::INIT { result.push(get_line_res(&s, mode)); s.clear(); } mode = Mode::LEFT; if s.len() > 0 { s.push('\n') } s.push_str(l); } diff::Result::Right(r) => { if mode != Mode::RIGHT && mode != Mode::INIT { result.push(get_line_res(&s, mode)); s.clear(); } mode = Mode::RIGHT; if s.len() > 0 { s.push('\n') } s.push_str(r); } diff::Result::Both(l, _) => { if mode != Mode::BOTH && mode != Mode::INIT { result.push(get_line_res(&s, mode)); s.clear() } mode = Mode::BOTH; if s.len() > 0 { s.push('\n') } s.push_str(l); } } } if s.len() > 0 { result.push(get_line_res(&s, mode)); s.clear(); } result }