task_picker/
sources.rs

1mod caldav;
2mod github;
3mod gitlab;
4mod openproject;
5
6pub use caldav::CalDavSource;
7pub use github::GitHubSource;
8pub use gitlab::GitLabSource;
9use keyring::Entry;
10pub use openproject::OpenProjectSource;
11
12use serde::{Deserialize, Serialize};
13
14pub const CALDAV_ICON: &str = egui_phosphor::regular::CALENDAR;
15pub const GITHUB_ICON: &str = egui_phosphor::regular::GITHUB_LOGO;
16pub const GITLAB_ICON: &str = egui_phosphor::regular::GITLAB_LOGO;
17pub const OPENPROJECT_ICON: &str = egui_phosphor::regular::INFINITY;
18
19#[non_exhaustive]
20#[derive(Serialize, Deserialize, Clone)]
21pub enum TaskSource {
22    CalDav(CalDavSource),
23    GitHub(GitHubSource),
24    GitLab(GitLabSource),
25    OpenProject(OpenProjectSource),
26}
27
28impl TaskSource {
29    pub fn name(&self) -> &str {
30        match self {
31            TaskSource::CalDav(s) => s.calendar_name.as_str(),
32            TaskSource::GitHub(s) => s.name.as_str(),
33            TaskSource::GitLab(s) => s.name.as_str(),
34            TaskSource::OpenProject(s) => s.name.as_str(),
35        }
36    }
37
38    pub fn type_name(&self) -> &str {
39        match self {
40            TaskSource::CalDav(_) => "CalDAV",
41            TaskSource::GitHub(_) => "GitHub",
42            TaskSource::GitLab(_) => "GitLab",
43            TaskSource::OpenProject(_) => "OpenProject",
44        }
45    }
46
47    pub fn icon(&self) -> &str {
48        match self {
49            TaskSource::CalDav(_) => CALDAV_ICON,
50            TaskSource::GitHub(_) => GITHUB_ICON,
51            TaskSource::GitLab(_) => GITLAB_ICON,
52            TaskSource::OpenProject(_) => OPENPROJECT_ICON,
53        }
54    }
55
56    /// Returns the secret (e.g. a password or a token) for this task source.
57    pub fn secret(&self) -> Option<String> {
58        let keyring_entry = Entry::new("task-picker", self.name()).ok()?;
59        let secret = keyring_entry.get_password().ok()?;
60        Some(secret)
61    }
62}