You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.4 KiB
Rust
43 lines
1.4 KiB
Rust
use crate::bibliography::bibliography_entry::{BibliographyEntry, BibliographyEntryReference};
|
|
use crate::bibliography::keys::K_KEY;
|
|
use crate::bibliography::FromHashMap;
|
|
use parking_lot::Mutex;
|
|
use std::collections::HashMap;
|
|
use std::sync::Arc;
|
|
|
|
/// A dictionary that contains all bibliography entries
|
|
#[derive(Clone, Debug)]
|
|
pub struct BibliographyDictionary {
|
|
entries: HashMap<String, BibliographyEntryReference>,
|
|
}
|
|
|
|
impl BibliographyDictionary {
|
|
/// Creates a new empty BibliographyDictionary
|
|
pub fn new() -> Self {
|
|
Self {
|
|
entries: HashMap::new(),
|
|
}
|
|
}
|
|
|
|
/// Inserts a bibliography entry into the map
|
|
pub fn insert(&mut self, entry: BibliographyEntry) {
|
|
self.entries
|
|
.insert(entry.key(), Arc::new(Mutex::new(entry)));
|
|
}
|
|
|
|
/// Inserts a bibliography entry represented as a HashMap
|
|
pub fn insert_map(&mut self, map: &HashMap<String, String>) -> Result<(), String> {
|
|
let key = map.get(K_KEY).ok_or(missing_field!(K_KEY))?;
|
|
let entry = *BibliographyEntry::from_hash_map(map)?;
|
|
self.entries
|
|
.insert(key.clone(), Arc::new(Mutex::new(entry)));
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Returns the reference to the bibliography entry with the given key
|
|
pub fn get(&self, key: &str) -> Option<BibliographyEntryReference> {
|
|
self.entries.get(&key.to_string()).cloned()
|
|
}
|
|
}
|