md-todo 0.1.1

Work with todos in markdown files.
Documentation
use crate::error::MDTodoError;
use crate::md_reader;
use crate::todo::Todo;
use anyhow::Result;
use std::fs;
use std::path::Path;

pub fn toggle_todo(todo: &mut Todo) -> Result<()> {
    if did_file_change_since_read(todo)? {
        return Err(anyhow::Error::new(MDTodoError::FileChanged));
    }

    let data = fs::read_to_string(Path::new(&todo.filepath))?;
    let mut new_data: String = String::new();

    let mut line_no = 1;
    for line in data.lines() {
        if line_no == todo.line_no {
            if todo.done {
                new_data += &line.replace("- [x]", "- [ ]");
                todo.done = false;
            } else {
                new_data += &line.replace("- [ ]", "- [x]");
                todo.done = true;
            }
        } else {
            new_data += line;
        }
        new_data += "\n";
        line_no += 1;
    }

    fs::write(&todo.filepath, new_data)?;

    Ok(())
}

fn did_file_change_since_read(todo: &mut Todo) -> Result<bool> {
    let file_content = fs::read_to_string(&todo.filepath)?;
    let file_md5 = md_reader::get_file_content_md5(&file_content);
    Ok(file_md5 != todo.file_md5)
}