tex-fmt 0.4.1

LaTeX formatter written in Rust
use crate::format::*;
use crate::logging::*;
use crate::regexes::*;
use log::Level::Warn;

#[derive(Clone, Debug)]
pub struct Leave {
    pub actual: i8,
    pub visual: bool,
}

impl Leave {
    pub fn new() -> Self {
        Leave {
            actual: 0,
            visual: false,
        }
    }
}

pub fn get_leave(
    line: &str,
    state: &State,
    logs: &mut Vec<Log>,
    file: &str,
    warn: bool,
) -> Leave {
    let diff = get_leave_diff(line);
    let actual = state.leave.actual + diff;
    let visual = actual > 0 && state.leave.actual > 0;

    if warn && (actual < 0) {
        record_line_log(
            logs,
            Warn,
            file,
            state.linum_new,
            state.linum_old,
            line,
            "Leave count is negative.",
        );
    }

    Leave { actual, visual }
}

fn get_leave_diff(line: &str) -> i8 {
    if RE_ENV_BEGIN.is_match(line)
        && RE_LEAVES_BEGIN.iter().any(|r| r.is_match(line))
    {
        1
    } else if RE_ENV_END.is_match(line)
        && RE_LEAVES_END.iter().any(|r| r.is_match(line))
    {
        -1
    } else {
        0
    }
}