nexedit 0.2.2

A vim-like text editor, with simple shortcuts.
Documentation
pub use self::selectable_vec::SelectableVec;

pub mod movement_lexer;
pub mod reflow;
mod selectable_vec;
pub mod token;

use crate::errors::*;
use crate::models::Application;
use scribe::buffer::{Buffer, LineRange, Position, Range};

pub fn inclusive_range(line_range: &LineRange, buffer: &mut Buffer) -> Range {
    let data = buffer.data();
    let next_line = line_range.end() + 1;
    let line_count = buffer.line_count();
    let end_position = if line_count > next_line {
        Position {
            line: next_line,
            offset: 0,
        }
    } else {
        match data.lines().nth(line_range.end()) {
            Some(line_content) => {
                Position {
                    line: line_range.end(),
                    offset: line_content.len(),
                }
            }
            None => Position {
                line: line_range.end(),
                offset: 0,
            },
        }
    };

    Range::new(
        Position {
            line: line_range.start(),
            offset: 0,
        },
        end_position,
    )
}

pub fn add_buffer(buffer: Buffer, app: &mut Application) -> Result<()> {
    app.workspace.add_buffer(buffer);
    app.view
        .initialize_buffer(app.workspace.current_buffer.as_mut().unwrap())?;

    Ok(())
}

#[cfg(test)]
mod tests {
    use scribe::buffer::{LineRange, Position, Range};
    use scribe::Buffer;

    #[test]
    fn inclusive_range_works_correctly_without_trailing_newline() {
        let mut buffer = Buffer::new();
        buffer.insert("nexedit");
        let range = LineRange::new(1, 1);

        assert_eq!(
            super::inclusive_range(&range, &mut buffer),
            Range::new(
                Position { line: 1, offset: 0 },
                Position { line: 1, offset: 6 }
            )
        );
    }

    #[test]
    fn inclusive_range_works_correctly_with_trailing_newline() {
        let mut buffer = Buffer::new();
        buffer.insert("nexedit\n");
        let range = LineRange::new(1, 1);

        assert_eq!(
            super::inclusive_range(&range, &mut buffer),
            Range::new(
                Position { line: 1, offset: 0 },
                Position { line: 2, offset: 0 }
            )
        );
    }
}