month_tasks.rs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. use std::path::{Path, PathBuf};
  2. use chrono::{TimeZone, Utc};
  3. use log::debug;
  4. use serde::{Deserialize, Serialize};
  5. use crate::{
  6. error::{TaudError, TaudResult},
  7. task_debug::TaskInfo,
  8. util::{get_current_time, load, save, Timestamp},
  9. };
  10. #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
  11. pub struct MonthTasks {
  12. created_at: Timestamp,
  13. task_tks: Vec<String>,
  14. }
  15. impl MonthTasks {
  16. pub fn new(task_tks: &[String]) -> Self {
  17. Self { created_at: get_current_time(), task_tks: task_tks.to_owned() }
  18. }
  19. pub fn add(&mut self, ref_id: &str) {
  20. debug!(target: "tau", "MonthTasks::add()");
  21. if !self.task_tks.contains(&ref_id.into()) {
  22. self.task_tks.push(ref_id.into());
  23. }
  24. }
  25. pub fn objects(&self, dataset_path: &Path) -> TaudResult<Vec<TaskInfo>> {
  26. debug!(target: "tau", "MonthTasks::objects()");
  27. let mut tks: Vec<TaskInfo> = vec![];
  28. for ref_id in self.task_tks.iter() {
  29. tks.push(TaskInfo::load(ref_id, dataset_path)?);
  30. }
  31. Ok(tks)
  32. }
  33. pub fn remove(&mut self, ref_id: &str) {
  34. debug!(target: "tau", "MonthTasks::remove()");
  35. if let Some(index) = self.task_tks.iter().position(|t| *t == ref_id) {
  36. self.task_tks.remove(index);
  37. }
  38. }
  39. pub fn set_date(&mut self, date: &Timestamp) {
  40. debug!(target: "tau", "MonthTasks::set_date()");
  41. self.created_at = date.clone();
  42. }
  43. fn get_path(date: &Timestamp, dataset_path: &Path) -> PathBuf {
  44. debug!(target: "tau", "MonthTasks::get_path()");
  45. dataset_path.join("month").join(Utc.timestamp(date.0, 0).format("%m%y").to_string())
  46. }
  47. pub fn save(&self, dataset_path: &Path) -> TaudResult<()> {
  48. debug!(target: "tau", "MonthTasks::save()");
  49. save::<Self>(&Self::get_path(&self.created_at, dataset_path), self)
  50. .map_err(TaudError::Darkfi)
  51. }
  52. pub fn load_or_create(date: &Timestamp, dataset_path: &Path) -> TaudResult<Self> {
  53. debug!(target: "tau", "MonthTasks::load_or_create()");
  54. match load::<Self>(&Self::get_path(date, dataset_path)) {
  55. Ok(mt) => Ok(mt),
  56. Err(_) => {
  57. let mut mt = Self::new(&[]);
  58. mt.set_date(date);
  59. mt.save(dataset_path)?;
  60. Ok(mt)
  61. }
  62. }
  63. }
  64. pub fn load_current_open_tasks(dataset_path: &Path) -> TaudResult<Vec<TaskInfo>> {
  65. debug!(target: "tau", "MonthTasks::load_current_open_tasks()");
  66. let mt = Self::load_or_create(&get_current_time(), dataset_path)?;
  67. Ok(mt.objects(dataset_path)?.into_iter().filter(|t| t.get_state() != "stop").collect())
  68. }
  69. }
  70. #[cfg(test)]
  71. mod tests {
  72. use std::{
  73. fs::{create_dir_all, remove_dir_all},
  74. path::PathBuf,
  75. };
  76. use super::*;
  77. use darkfi::Result;
  78. const TEST_DATA_PATH: &str = "/tmp/test_tau_data";
  79. fn get_path() -> Result<PathBuf> {
  80. remove_dir_all(TEST_DATA_PATH).ok();
  81. let path = PathBuf::from(TEST_DATA_PATH);
  82. // mkdir dataset_path if not exists
  83. create_dir_all(path.join("month"))?;
  84. create_dir_all(path.join("task"))?;
  85. Ok(path)
  86. }
  87. #[test]
  88. fn load_and_save_tasks() -> TaudResult<()> {
  89. let dataset_path = get_path()?;
  90. // load and save TaskInfo
  91. ///////////////////////
  92. let mut task = TaskInfo::new("test_title", "test_desc", None, 0.0, &dataset_path)?;
  93. task.save(&dataset_path)?;
  94. let t_load = TaskInfo::load(&task.ref_id, &dataset_path)?;
  95. assert_eq!(task, t_load);
  96. task.set_title("test_title_2");
  97. task.save(&dataset_path)?;
  98. let t_load = TaskInfo::load(&task.ref_id, &dataset_path)?;
  99. assert_eq!(task, t_load);
  100. // load and save MonthTasks
  101. ///////////////////////
  102. let task_tks = vec![];
  103. let mut mt = MonthTasks::new(&task_tks);
  104. mt.save(&dataset_path)?;
  105. let mt_load = MonthTasks::load_or_create(&get_current_time(), &dataset_path)?;
  106. assert_eq!(mt, mt_load);
  107. mt.add(&task.ref_id);
  108. mt.save(&dataset_path)?;
  109. let mt_load = MonthTasks::load_or_create(&get_current_time(), &dataset_path)?;
  110. assert_eq!(mt, mt_load);
  111. // activate task
  112. ///////////////////////
  113. let task = TaskInfo::new("test_title_3", "test_desc", None, 0.0, &dataset_path)?;
  114. task.save(&dataset_path)?;
  115. let mt_load = MonthTasks::load_or_create(&get_current_time(), &dataset_path)?;
  116. assert!(mt_load.task_tks.contains(&task.ref_id));
  117. remove_dir_all(TEST_DATA_PATH).ok();
  118. Ok(())
  119. }
  120. }