Add FromHashMap impl for Repository

Signed-off-by: trivernis <trivernis@protonmail.com>
main
trivernis 4 years ago
parent fea41f3810
commit c119046923
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

@ -79,6 +79,7 @@ impl FromHashMap for BibliographyType {
)?))), )?))),
T_MANUAL => Some(Box::new(Self::Manual(*Manual::from_hash_map(map)?))), T_MANUAL => Some(Box::new(Self::Manual(*Manual::from_hash_map(map)?))),
T_MISC => Some(Box::new(Self::Misc(*Misc::from_hash_map(map)?))), T_MISC => Some(Box::new(Self::Misc(*Misc::from_hash_map(map)?))),
T_REPOSITORY => Some(Box::new(Self::Repository(*Repository::from_hash_map(map)?))),
_ => None, _ => None,
} }
} }

@ -1,4 +1,8 @@
use crate::utils::date::LocalDate; use crate::bibliography::keys::{K_ACCESSED_AT, K_AUTHOR, K_CMS, K_LICENSE, K_TITLE, K_URL};
use crate::bibliography::FromHashMap;
use crate::utils::date::{parse_date, LocalDate};
use std::collections::hash_map::RandomState;
use std::collections::HashMap;
/// A repository source that represents any git repository or similar /// A repository source that represents any git repository or similar
/// structures /// structures
@ -25,3 +29,18 @@ impl Repository {
} }
} }
} }
impl FromHashMap for Repository {
fn from_hash_map(map: &HashMap<String, String, RandomState>) -> Option<Box<Self>> {
let author = map.get(K_AUTHOR)?;
let title = map.get(K_TITLE)?;
let mut repo = Repository::new(author.clone(), title.clone());
repo.url = map.get(K_URL).cloned();
repo.license = map.get(K_LICENSE).cloned();
repo.cms = map.get(K_CMS).cloned();
repo.accessed_at = map.get(K_ACCESSED_AT).and_then(|d| parse_date(d));
Some(Box::new(repo))
}
}

@ -18,6 +18,8 @@ pub const K_HOW_PUBLISHED: &str = "how_published";
pub const K_EDITOR: &str = "editor"; pub const K_EDITOR: &str = "editor";
pub const K_POSITION: &str = "position"; pub const K_POSITION: &str = "position";
pub const K_ORGANIZATION: &str = "organization"; pub const K_ORGANIZATION: &str = "organization";
pub const K_CMS: &str = "cms";
pub const K_ACCESSED_AT: &str = "accessed_at";
pub const T_ARTICLE: &str = "article"; pub const T_ARTICLE: &str = "article";
pub const T_BOOK: &str = "book"; pub const T_BOOK: &str = "book";

@ -127,4 +127,17 @@ mod tests {
let entry = BibliographyEntry::from_hash_map(&map).unwrap(); let entry = BibliographyEntry::from_hash_map(&map).unwrap();
assert_eq!(entry.bib_type.name(), "misc".to_string()) assert_eq!(entry.bib_type.name(), "misc".to_string())
} }
#[test]
fn it_creates_repos_from_hashmaps() {
let mut map: HashMap<String, String> = HashMap::new();
map.insert("key".to_string(), "test_entry".to_string());
map.insert("type".to_string(), "repository".to_string());
map.insert("author".to_string(), "trivernis".to_string());
map.insert("title".to_string(), "snekdown".to_string());
map.insert("note".to_string(), "This is a test".to_string());
let entry = BibliographyEntry::from_hash_map(&map).unwrap();
assert_eq!(entry.bib_type.name(), "repository".to_string())
}
} }

Loading…
Cancel
Save