summaryrefslogtreecommitdiffstats
path: root/src/actions/delete.rs
blob: ac2065a9b3b6f6a1e8471f213aa7d702aee1ee9e (plain)
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
use crate::input;
use crate::backup::backup;
use crate::KhResult;
use crate::khline::KhLine;
use crate::utils::stdioutils;

use std::path::PathBuf;
use std::fs::remove_file;

pub fn do_delete() -> KhResult<()> {
  info!("do_delete");

  let cursor_khline = input::default_input_khline()?;

  delete_file(cursor_khline)
}

fn delete_file(khline: KhLine) -> KhResult<()> {

  if ask_really_delete(&khline.path) {
    let backup_path = backup(&khline).unwrap();
    info!("Backup written to {}", backup_path.display());

    remove_file(khline.path.clone())?;
    info!("deleted {:#?}", khline.get_normalized_path());
  }

  Ok(())
}

fn ask_really_delete(path: &PathBuf) -> bool {
  if cfg!(test) { return true };

  println!("Really delete {:#?}? y/n:", path);

  match stdioutils::read_single_char_from_stdin().unwrap() {
    'y' => true,
    _ => false
  }
}

#[cfg(test)]
mod tests {
  use super::*;

  use crate::testutils::*;
  use assert_fs::prelude::*;
  use predicates::prelude::*;

  #[test]
  fn test_do_delete_cursor() {
    let testdir = prepare_testdir("testdir_with_cursor");

    do_delete().unwrap();

    let predicate = predicate::path::missing();
    testdir.child(".khaleesi/cal/twodaysacrossbuckets").assert(predicate);
    
  }

  #[test]
  #[should_panic]
  fn test_do_delete_no_cursor() {
    let _testdir = prepare_testdir("testdir");

    do_delete().unwrap();
  }
}