Compare plain list type in diff.rs.

This commit is contained in:
Tom Alexander 2023-09-29 13:03:01 -04:00
parent a4b1d462c3
commit f820e27b17
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
3 changed files with 32 additions and 5 deletions

View File

@ -9,6 +9,7 @@ use super::sexp::unquote;
use super::sexp::Token; use super::sexp::Token;
use super::util::compare_standard_properties; use super::util::compare_standard_properties;
use super::util::get_property; use super::util::get_property;
use super::util::get_property_unquoted_atom;
use crate::types::AngleLink; use crate::types::AngleLink;
use crate::types::BabelCall; use crate::types::BabelCall;
use crate::types::Bold; use crate::types::Bold;
@ -50,6 +51,7 @@ use crate::types::Paragraph;
use crate::types::PlainLink; use crate::types::PlainLink;
use crate::types::PlainList; use crate::types::PlainList;
use crate::types::PlainListItem; use crate::types::PlainListItem;
use crate::types::PlainListType;
use crate::types::PlainText; use crate::types::PlainText;
use crate::types::Planning; use crate::types::Planning;
use crate::types::PriorityCookie; use crate::types::PriorityCookie;
@ -748,11 +750,24 @@ fn compare_plain_list<'s>(
) -> Result<DiffEntry<'s>, Box<dyn std::error::Error>> { ) -> Result<DiffEntry<'s>, Box<dyn std::error::Error>> {
let children = emacs.as_list()?; let children = emacs.as_list()?;
let mut child_status = Vec::new(); let mut child_status = Vec::new();
let this_status = DiffStatus::Good; let mut this_status = DiffStatus::Good;
let message = None; let mut message = None;
// TODO: Compare :type
//
// :type is an unquoted atom of either descriptive, ordered, or unordered // :type is an unquoted atom of either descriptive, ordered, or unordered
let list_type = get_property_unquoted_atom(emacs, ":type")?;
match (list_type, &rust.list_type) {
(None, _) => panic!("Emacs returned a list with no type."),
(Some("unordered"), PlainListType::Unordered) => {}
(Some("ordered"), PlainListType::Ordered) => {}
(Some("descriptive"), PlainListType::Descriptive) => {}
_ => {
this_status = DiffStatus::Bad;
message = Some(format!(
"List type mismatch (emacs != rust) {:?} != {:?}",
list_type, rust.list_type
));
}
}
for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) { for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) {
child_status.push(compare_plain_list_item(source, emacs_child, rust_child)?); child_status.push(compare_plain_list_item(source, emacs_child, rust_child)?);

View File

@ -190,3 +190,15 @@ pub(crate) fn get_property<'s, 'x>(
}; };
Ok(Some(*prop)) Ok(Some(*prop))
} }
/// Get a named property containing an unquoted atom from the emacs token.
///
/// Returns None if key is not found.
pub(crate) fn get_property_unquoted_atom<'s, 'x>(
emacs: &'s Token<'s>,
key: &'x str,
) -> Result<Option<&'s str>, Box<dyn std::error::Error>> {
Ok(get_property(emacs, key)?
.map(Token::as_atom)
.map_or(Ok(None), |r| r.map(Some))?)
}

View File

@ -148,7 +148,7 @@ pub(crate) fn plain_list<'b, 'g, 'r, 's>(
remaining, remaining,
PlainList { PlainList {
source: source.into(), source: source.into(),
list_type: PlainListType::Ordered, list_type: first_item_list_type.expect("Plain lists require at least one element."),
children: children.into_iter().map(|(_start, item)| item).collect(), children: children.into_iter().map(|(_start, item)| item).collect(),
}, },
)) ))