Merge branch 'radio_target_properties'
All checks were successful
rustfmt Build rustfmt has succeeded
rust-build Build rust-build has succeeded
rust-test Build rust-test has succeeded
rust-foreign-document-test Build rust-foreign-document-test has succeeded

This commit is contained in:
Tom Alexander 2023-10-07 01:43:58 -04:00
commit 5694f80f41
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
3 changed files with 38 additions and 13 deletions

View File

@ -1,5 +1,6 @@
use std::borrow::Cow; use std::borrow::Cow;
// TODO: Add a check for unexpected keys in the properties // TODO: Update all to use the macro to assert there are no unexpected keys.
// TODO: Check all compare funtions for whether they correctly iterate children.
use std::collections::BTreeSet; use std::collections::BTreeSet;
use std::collections::HashSet; use std::collections::HashSet;
@ -2893,14 +2894,31 @@ fn compare_radio_link<'b, 's>(
} }
fn compare_radio_target<'b, 's>( fn compare_radio_target<'b, 's>(
_source: &'s str, source: &'s str,
emacs: &'b Token<'s>, emacs: &'b Token<'s>,
rust: &'b RadioTarget<'s>, rust: &'b RadioTarget<'s>,
) -> Result<DiffEntry<'b, 's>, Box<dyn std::error::Error>> { ) -> Result<DiffEntry<'b, 's>, Box<dyn std::error::Error>> {
let this_status = DiffStatus::Good; let children = emacs.as_list()?;
let message = None; let mut this_status = DiffStatus::Good;
let mut child_status = Vec::new();
let mut message = None;
// TODO: Compare :value if let Some((new_status, new_message)) = compare_properties!(
emacs,
rust,
(
EmacsField::Required(":value"),
|r| Some(r.value),
compare_property_quoted_string
)
)? {
this_status = new_status;
message = new_message;
}
for (emacs_child, rust_child) in children.iter().skip(2).zip(rust.children.iter()) {
child_status.push(compare_ast_node(source, emacs_child, rust_child.into())?);
}
Ok(DiffResult { Ok(DiffResult {
status: this_status, status: this_status,

View File

@ -2,6 +2,8 @@ use nom::branch::alt;
use nom::bytes::complete::tag; use nom::bytes::complete::tag;
use nom::character::complete::line_ending; use nom::character::complete::line_ending;
use nom::character::complete::space0; use nom::character::complete::space0;
use nom::combinator::consumed;
use nom::combinator::map;
use nom::combinator::verify; use nom::combinator::verify;
use nom::multi::many_till; use nom::multi::many_till;
@ -108,13 +110,16 @@ pub(crate) fn radio_target<'b, 'g, 'r, 's>(
}); });
let parser_context = context.with_additional_node(&parser_context); let parser_context = context.with_additional_node(&parser_context);
let (remaining, (children, _exit_contents)) = verify( let (remaining, (raw_value, children)) = consumed(verify(
map(
many_till( many_till(
parser_with_context!(minimal_set_object)(&parser_context), parser_with_context!(minimal_set_object)(&parser_context),
parser_with_context!(exit_matcher_parser)(&parser_context), parser_with_context!(exit_matcher_parser)(&parser_context),
), ),
|(children, _exit_contents)| !children.is_empty(), |(children, _)| children,
)(remaining)?; ),
|children: &Vec<_>| !children.is_empty(),
))(remaining)?;
let (remaining, _closing) = tag(">>>")(remaining)?; let (remaining, _closing) = tag(">>>")(remaining)?;
let (remaining, _trailing_whitespace) = let (remaining, _trailing_whitespace) =
@ -124,6 +129,7 @@ pub(crate) fn radio_target<'b, 'g, 'r, 's>(
remaining, remaining,
RadioTarget { RadioTarget {
source: source.into(), source: source.into(),
value: raw_value.into(),
children, children,
}, },
)) ))

View File

@ -90,14 +90,15 @@ pub struct RegularLink<'s> {
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub struct RadioTarget<'s> { pub struct RadioTarget<'s> {
pub source: &'s str, pub source: &'s str,
pub value: &'s str,
pub children: Vec<Object<'s>>, pub children: Vec<Object<'s>>,
} }
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub struct RadioLink<'s> { pub struct RadioLink<'s> {
pub source: &'s str, pub source: &'s str,
pub path: Cow<'s, str>, pub path: &'s str,
pub raw_link: Cow<'s, str>, pub raw_link: &'s str, // TODO: Is this always the same as path? If so, this could be a function instead of a field.
pub children: Vec<Object<'s>>, pub children: Vec<Object<'s>>,
} }