Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 

75 Zeilen
2.7 KiB

  1. use std::collections::BTreeSet;
  2. use parking_lot::RwLock;
  3. use regex::Regex;
  4. use tracing::info;
  5. use crate::client_manager::ClientManager;
  6. use crate::helpers::{determine_active_trackers, get_trackers};
  7. use crate::models::{TrackerInfo, TrackerMap};
  8. pub struct TrackerInfoManager {
  9. trackers: RwLock<TrackerMap>,
  10. active_trackers: RwLock<BTreeSet<String>>,
  11. included_projects: Vec<Regex>,
  12. excluded_projects: Vec<Regex>,
  13. inactive_minutes: u64,
  14. }
  15. impl TrackerInfoManager {
  16. pub fn new(client_mgr: &ClientManager, included_projects: Vec<Regex>, excluded_projects: Vec<Regex>, inactive_minutes: u64) -> color_eyre::Result<Self> {
  17. info!("Fetching projects...");
  18. let t = get_trackers(client_mgr)?;
  19. info!("Found {} projects.", t.len());
  20. let a = determine_active_trackers(client_mgr, &t, inactive_minutes.clone())?;
  21. info!("Found {} projects are active.", a.len());
  22. Ok(Self {
  23. trackers: RwLock::new(t),
  24. active_trackers: RwLock::new(a),
  25. included_projects,
  26. excluded_projects,
  27. inactive_minutes,
  28. })
  29. }
  30. pub fn refresh_trackers(&self, client_mgr: &ClientManager) -> color_eyre::Result<()> {
  31. let mut l = self.trackers.write();
  32. *l = get_trackers(client_mgr)?;
  33. Ok(())
  34. }
  35. pub fn refresh_active_trackers(&self, client_mgr: &ClientManager) -> color_eyre::Result<()> {
  36. let r = self.trackers.read();
  37. let new = determine_active_trackers(client_mgr, &r, self.inactive_minutes.clone())?;
  38. let mut w = self.active_trackers.write();
  39. *w = new;
  40. Ok(())
  41. }
  42. pub fn get_tracker_info(&self, name: &str) -> color_eyre::Result<TrackerInfo> {
  43. let l = self.trackers.read();
  44. if let Some(v) = l.get(&name.to_string()) {
  45. Ok(v.clone())
  46. } else {
  47. Err(color_eyre::eyre::eyre!("Tracker {} not found!", name))
  48. }
  49. }
  50. pub fn project_is_included(&self, name: &str) -> bool {
  51. self.included_projects.iter().all(|r| r.is_match(name))
  52. }
  53. pub fn project_is_excluded(&self, name: &str) -> bool {
  54. self.excluded_projects.iter().any(|r| r.is_match(name))
  55. }
  56. pub fn project_is_active(&self, name: &str) -> bool {
  57. (self.inactive_minutes == 0) || self.active_trackers.read().contains(&name.to_string())
  58. }
  59. pub fn enabled_projects(&self) -> Vec<(String, TrackerInfo)> {
  60. self.trackers.read().iter()
  61. .filter(|(name, _)| {
  62. self.project_is_included(name) && !self.project_is_excluded(name) && self.project_is_active(name)
  63. })
  64. .map(|(a, b)| (a.clone(), b.clone()))
  65. .collect()
  66. }
  67. }