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 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}