1use crate::FileHandler;
2use colored::*;
3use std::iter::FromIterator;
4use std::ops::RangeInclusive;
5use std::path::Path;
6
7pub struct Notes {
8 file: FileHandler,
9 lines: Vec<String>,
10}
11
12impl Notes {
13 pub fn new<P: AsRef<Path>>(path: P) -> Self {
14 let file = FileHandler::new(path);
15 Notes {
16 lines: file.read(),
17 file,
18 }
19 }
20 pub fn delete_line(mut self, index: usize) -> Self {
21 self.lines.remove(index);
22 self
23 }
24 pub fn delete_range_lines(mut self, range: RangeInclusive<usize>) -> Self {
25 self.lines.drain(range);
26 self
27 }
28 pub fn append_line(mut self, line: &str) -> Self {
29 self.lines.extend(
30 line
31 .lines()
32 .map(|x| x.trim().to_string())
33 .collect::<Vec<String>>(),
34 );
35 self
36 }
37 pub fn insert_line(mut self, index: usize, line: &str) -> Self {
38 self.lines.insert(index, line.to_owned());
39 self
40 }
41 pub fn get_line(&self, index: usize) -> String {
42 self.lines.get(index).unwrap().clone()
43 }
44 pub fn get_range_lines(&self, range: RangeInclusive<usize>) -> String {
45 Vec::from_iter(self.lines[range].iter().cloned())
46 .into_iter()
47 .map(|x| x + "\n")
48 .collect::<Vec<String>>()
49 .join("")
50 }
51 pub fn count_lines(&self) -> usize {
52 self.lines.len()
53 }
54 pub fn print_line(self, index: usize) -> Self {
55 println!(
56 "{}",
57 self.lines.get(index).unwrap_or(&"Not Exist".to_owned())
58 );
59 self
60 }
61 pub fn print_all_lines(self) -> Self {
62 for (i, v) in self.lines.clone().iter().enumerate() {
63 println!("({})- {}", i.to_string().green(), v);
64 }
65 self
66 }
67 pub fn flush(self) -> std::io::Result<()> {
68 self.file.write(self.lines)
69 }
70}