use serde::Deserialize;
use super::cycle::Cycle;
use super::ids::*;
use super::issue::IssueRef;
use super::page::Ref;
use super::project::Project;
#[allow(dead_code)]
#[derive(Debug, Clone, Deserialize)]
pub struct Favorite {
pub id: FavoriteId,
#[serde(rename = "type")]
pub kind: String,
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub color: Option<String>,
#[serde(default, rename = "sortOrder")]
pub sort_order: f64,
#[serde(default)]
pub parent: Option<Ref<FavoriteId>>,
#[serde(default, rename = "folderName")]
pub folder_name: Option<String>,
#[serde(default, rename = "predefinedViewType")]
pub predefined_view_type: Option<String>,
#[serde(default, rename = "predefinedViewTeam")]
pub predefined_view_team: Option<Ref<TeamId>>,
#[serde(default, rename = "customView")]
pub custom_view: Option<Ref<CustomViewId>>,
#[serde(default)]
pub issue: Option<IssueRef>,
#[serde(default)]
pub project: Option<Project>,
#[serde(default)]
pub cycle: Option<Cycle>,
}
impl Favorite {
pub fn is_folder(&self) -> bool {
self.kind == "folder"
}
pub fn label(&self) -> String {
self.title
.clone()
.or_else(|| self.folder_name.clone())
.or_else(|| self.project.as_ref().map(|p| p.name.clone()))
.or_else(|| self.issue.as_ref().map(|i| i.title.clone()))
.unwrap_or_else(|| self.kind.clone())
}
}
#[cfg(test)]
mod tests {
use super::*;
fn fav(json: &str) -> Favorite {
serde_json::from_str(json).unwrap()
}
#[test]
fn a_favorite_is_called_by_its_title_then_what_it_holds() {
assert_eq!(
fav(r#"{"id":"f","type":"project","title":"T"}"#).label(),
"T"
);
assert_eq!(
fav(r#"{"id":"f","type":"folder","folderName":"Ops"}"#).label(),
"Ops"
);
assert_eq!(
fav(r#"{"id":"f","type":"project","project":{"id":"p","name":"P"}}"#).label(),
"P"
);
assert_eq!(
fav(
r#"{"id":"f","type":"issue","issue":{"id":"i","identifier":"X-1","title":"Crash"}}"#
)
.label(),
"Crash"
);
assert_eq!(fav(r#"{"id":"f","type":"document"}"#).label(), "document");
}
#[test]
fn only_a_folder_folds() {
assert!(fav(r#"{"id":"f","type":"folder"}"#).is_folder());
assert!(!fav(r#"{"id":"f","type":"project"}"#).is_folder());
}
}