diff options
Diffstat (limited to 'support/texlab/src/citation/entry.rs')
-rw-r--r-- | support/texlab/src/citation/entry.rs | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/support/texlab/src/citation/entry.rs b/support/texlab/src/citation/entry.rs index c8b3f98753..1fee032488 100644 --- a/support/texlab/src/citation/entry.rs +++ b/support/texlab/src/citation/entry.rs @@ -3,7 +3,7 @@ use std::str::FromStr; use rustc_hash::FxHashMap; use strum::EnumString; -use crate::syntax::bibtex::{Entry, Field, HasName, HasType}; +use crate::syntax::bibtex::{Entry, Field, HasName, HasType, HasValue, Value}; use super::field::{ author::{AuthorField, AuthorFieldData}, @@ -67,8 +67,8 @@ pub struct EntryData { pub number: FxHashMap<NumberField, NumberFieldData>, } -impl EntryData { - pub fn parse(entry: &Entry) -> Option<Self> { +impl From<&Entry> for EntryData { + fn from(entry: &Entry) -> Self { let mut data = EntryData { kind: entry .type_token() @@ -81,42 +81,45 @@ impl EntryData { let _ = data.parse_field(&field); } - Some(data) + data } +} +impl EntryData { fn parse_field(&mut self, field: &Field) -> Option<()> { let name = field.name_token()?; let name = name.text(); - self.parse_author_field(field, name) - .or_else(|| self.parse_date_field(field, name)) - .or_else(|| self.parse_number_field(field, name)) - .or_else(|| self.parse_text_field(field, name)) + let value = field.value()?; + self.parse_author_field(name, &value) + .or_else(|| self.parse_date_field(name, &value)) + .or_else(|| self.parse_number_field(name, &value)) + .or_else(|| self.parse_text_field(name, &value)) } - fn parse_author_field(&mut self, field: &Field, name: &str) -> Option<()> { + fn parse_author_field(&mut self, name: &str, value: &Value) -> Option<()> { let name = AuthorField::parse(name)?; - let data = AuthorFieldData::parse(field)?; + let data = AuthorFieldData::parse(value)?; self.author.insert(name, data); Some(()) } - fn parse_date_field(&mut self, field: &Field, name: &str) -> Option<()> { + fn parse_date_field(&mut self, name: &str, value: &Value) -> Option<()> { let name = DateField::parse(name)?; - let data = DateFieldData::parse(field)?; + let data = DateFieldData::parse(value)?; self.date.insert(name, data); Some(()) } - fn parse_number_field(&mut self, field: &Field, name: &str) -> Option<()> { + fn parse_number_field(&mut self, name: &str, value: &Value) -> Option<()> { let name = NumberField::parse(name)?; - let data = NumberFieldData::parse(field)?; + let data = NumberFieldData::parse(value)?; self.number.insert(name, data); Some(()) } - fn parse_text_field(&mut self, field: &Field, name: &str) -> Option<()> { + fn parse_text_field(&mut self, name: &str, value: &Value) -> Option<()> { let name = TextField::parse(name).unwrap_or(TextField::Unknown); - let data = TextFieldData::parse(field)?; + let data = TextFieldData::parse(value)?; self.text.insert(name, data); Some(()) } |