summaryrefslogtreecommitdiff
path: root/support/texlab/src/citation/entry.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/citation/entry.rs')
-rw-r--r--support/texlab/src/citation/entry.rs35
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(())
}