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.
52 lines
1.4 KiB
Rust
52 lines
1.4 KiB
Rust
use crate::bibliography::bib_types::misc::Misc;
|
|
use crate::bibliography::bib_types::BibliographyType;
|
|
use crate::bibliography::keys::{K_KEY, K_NOTE};
|
|
use crate::bibliography::FromHashMap;
|
|
use parking_lot::Mutex;
|
|
use std::collections::hash_map::RandomState;
|
|
use std::collections::HashMap;
|
|
use std::sync::Arc;
|
|
|
|
/// A single bibliography entry
|
|
#[derive(Clone, Debug)]
|
|
pub struct BibliographyEntry {
|
|
key: String,
|
|
pub note: Option<String>,
|
|
pub bib_type: BibliographyType,
|
|
pub raw_fields: HashMap<String, String>,
|
|
}
|
|
|
|
pub type BibliographyEntryReference = Arc<Mutex<BibliographyEntry>>;
|
|
|
|
impl BibliographyEntry {
|
|
/// Creates a new bibliography entry with the given key
|
|
pub fn new(key: String) -> Self {
|
|
Self {
|
|
key,
|
|
note: None,
|
|
bib_type: BibliographyType::Misc(Misc::new()),
|
|
raw_fields: HashMap::new(),
|
|
}
|
|
}
|
|
|
|
/// Returns the key of the bibliography entry
|
|
pub fn key(&self) -> String {
|
|
self.key.clone()
|
|
}
|
|
}
|
|
|
|
impl FromHashMap for BibliographyEntry {
|
|
fn from_hash_map(map: &HashMap<String, String, RandomState>) -> Result<Box<Self>, String> {
|
|
let key = map.get(K_KEY).ok_or(missing_field!(K_KEY))?;
|
|
let bib_type = BibliographyType::from_hash_map(map)?;
|
|
|
|
let mut entry = Self::new(key.clone());
|
|
|
|
entry.note = map.get(K_NOTE).cloned();
|
|
entry.bib_type = *bib_type;
|
|
entry.raw_fields = map.clone();
|
|
|
|
Ok(Box::new(entry))
|
|
}
|
|
}
|