Compare plain list type in diff.rs.
This commit is contained in:
parent
a4b1d462c3
commit
f820e27b17
@ -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)?);
|
||||||
|
@ -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))?)
|
||||||
|
}
|
||||||
|
@ -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(),
|
||||||
},
|
},
|
||||||
))
|
))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user