2023-09-23 21:03:12 -04:00
use std ::borrow ::Cow ;
2023-09-23 14:46:36 -04:00
// TODO: Add a check for unexpected keys in the properties
2023-09-08 23:05:04 -04:00
use std ::collections ::BTreeSet ;
2023-08-25 06:46:00 -04:00
use std ::collections ::HashSet ;
2023-09-23 21:03:12 -04:00
use super ::elisp_fact ::ElispFact ;
use super ::elisp_fact ::GetElispFact ;
2023-09-11 15:31:48 -04:00
use super ::sexp ::unquote ;
use super ::sexp ::Token ;
2023-09-23 21:03:12 -04:00
use super ::util ::compare_standard_properties ;
2023-08-29 22:07:23 -04:00
use super ::util ::get_property ;
2023-09-29 17:28:50 -04:00
use super ::util ::get_property_quoted_string ;
2023-09-29 13:03:01 -04:00
use super ::util ::get_property_unquoted_atom ;
2023-09-03 12:52:09 -04:00
use crate ::types ::AngleLink ;
2023-09-23 21:03:12 -04:00
use crate ::types ::BabelCall ;
2023-09-03 12:52:09 -04:00
use crate ::types ::Bold ;
2023-09-15 15:30:13 -04:00
use crate ::types ::CheckboxType ;
2023-09-03 12:52:09 -04:00
use crate ::types ::Citation ;
use crate ::types ::CitationReference ;
use crate ::types ::Clock ;
use crate ::types ::Code ;
use crate ::types ::Comment ;
use crate ::types ::CommentBlock ;
use crate ::types ::DiarySexp ;
use crate ::types ::Document ;
use crate ::types ::DocumentElement ;
use crate ::types ::Drawer ;
use crate ::types ::DynamicBlock ;
use crate ::types ::Element ;
use crate ::types ::Entity ;
use crate ::types ::ExampleBlock ;
use crate ::types ::ExportBlock ;
use crate ::types ::ExportSnippet ;
use crate ::types ::FixedWidthArea ;
use crate ::types ::FootnoteDefinition ;
use crate ::types ::FootnoteReference ;
2023-09-23 19:13:01 -04:00
use crate ::types ::GetStandardProperties ;
2023-09-03 12:52:09 -04:00
use crate ::types ::GreaterBlock ;
use crate ::types ::Heading ;
use crate ::types ::HorizontalRule ;
use crate ::types ::InlineBabelCall ;
use crate ::types ::InlineSourceBlock ;
use crate ::types ::Italic ;
use crate ::types ::Keyword ;
use crate ::types ::LatexEnvironment ;
use crate ::types ::LatexFragment ;
use crate ::types ::LineBreak ;
2023-09-06 18:49:59 -04:00
use crate ::types ::NodeProperty ;
2023-09-03 12:52:09 -04:00
use crate ::types ::Object ;
use crate ::types ::OrgMacro ;
use crate ::types ::Paragraph ;
use crate ::types ::PlainLink ;
use crate ::types ::PlainList ;
use crate ::types ::PlainListItem ;
2023-09-29 18:45:38 -04:00
use crate ::types ::PlainListItemCounter ;
2023-09-29 19:30:02 -04:00
use crate ::types ::PlainListItemPreBlank ;
2023-09-29 13:03:01 -04:00
use crate ::types ::PlainListType ;
2023-09-03 12:52:09 -04:00
use crate ::types ::PlainText ;
use crate ::types ::Planning ;
2023-09-08 15:57:24 -04:00
use crate ::types ::PriorityCookie ;
2023-09-03 12:52:09 -04:00
use crate ::types ::PropertyDrawer ;
use crate ::types ::RadioLink ;
use crate ::types ::RadioTarget ;
use crate ::types ::RegularLink ;
use crate ::types ::Section ;
use crate ::types ::SrcBlock ;
2023-09-23 19:13:01 -04:00
use crate ::types ::StandardProperties ;
2023-09-03 12:52:09 -04:00
use crate ::types ::StatisticsCookie ;
use crate ::types ::StrikeThrough ;
use crate ::types ::Subscript ;
use crate ::types ::Superscript ;
use crate ::types ::Table ;
use crate ::types ::TableCell ;
use crate ::types ::TableRow ;
use crate ::types ::Target ;
use crate ::types ::Timestamp ;
2023-09-06 12:39:03 -04:00
use crate ::types ::TodoKeywordType ;
2023-09-03 12:52:09 -04:00
use crate ::types ::Underline ;
use crate ::types ::Verbatim ;
use crate ::types ::VerseBlock ;
2023-04-11 17:35:09 -04:00
2023-08-29 22:47:40 -04:00
#[ derive(Debug) ]
2023-09-11 13:13:28 -04:00
pub enum DiffEntry < ' s > {
2023-08-29 22:47:40 -04:00
DiffResult ( DiffResult < ' s > ) ,
DiffLayer ( DiffLayer < ' s > ) ,
}
2023-04-11 18:27:01 -04:00
#[ derive(Debug) ]
2023-09-11 13:13:28 -04:00
pub struct DiffResult < ' s > {
2023-04-11 18:27:01 -04:00
status : DiffStatus ,
2023-09-23 21:03:12 -04:00
name : Cow < ' s , str > ,
2023-04-19 15:19:21 -04:00
message : Option < String > ,
2023-08-29 22:47:40 -04:00
children : Vec < DiffEntry < ' s > > ,
2023-08-29 14:40:58 -04:00
rust_source : & ' s str ,
#[ allow(dead_code) ]
emacs_token : & ' s Token < ' s > ,
2023-04-11 18:27:01 -04:00
}
2023-04-11 19:22:42 -04:00
#[ derive(Debug, PartialEq) ]
2023-09-11 13:13:28 -04:00
enum DiffStatus {
2023-04-11 18:27:01 -04:00
Good ,
Bad ,
}
2023-08-29 22:47:40 -04:00
#[ derive(Debug) ]
2023-09-11 13:13:28 -04:00
pub struct DiffLayer < ' s > {
2023-09-23 21:03:12 -04:00
name : Cow < ' s , str > ,
2023-08-29 22:47:40 -04:00
children : Vec < DiffEntry < ' s > > ,
}
impl < ' s > From < DiffResult < ' s > > for DiffEntry < ' s > {
fn from ( value : DiffResult < ' s > ) -> Self {
DiffEntry ::DiffResult ( value )
}
}
impl < ' s > From < DiffLayer < ' s > > for DiffEntry < ' s > {
fn from ( value : DiffLayer < ' s > ) -> Self {
DiffEntry ::DiffLayer ( value )
}
}
impl < ' s > DiffEntry < ' s > {
fn has_bad_children ( & self ) -> bool {
match self {
DiffEntry ::DiffResult ( diff ) = > & diff . children ,
DiffEntry ::DiffLayer ( diff ) = > & diff . children ,
}
. iter ( )
. any ( | child | child . is_immediately_bad ( ) | | child . has_bad_children ( ) )
}
fn is_immediately_bad ( & self ) -> bool {
match self {
DiffEntry ::DiffResult ( diff ) = > diff . status = = DiffStatus ::Bad ,
DiffEntry ::DiffLayer ( _ ) = > false ,
}
}
2023-09-11 13:13:28 -04:00
pub fn is_bad ( & self ) -> bool {
2023-08-29 22:47:40 -04:00
self . is_immediately_bad ( ) | | self . has_bad_children ( )
}
2023-09-11 13:13:28 -04:00
pub fn print ( & self , original_document : & str ) -> Result < ( ) , Box < dyn std ::error ::Error > > {
2023-08-29 14:40:58 -04:00
self . print_indented ( 0 , original_document )
2023-04-11 18:27:01 -04:00
}
2023-08-29 22:47:40 -04:00
fn print_indented (
& self ,
indentation : usize ,
original_document : & str ,
) -> Result < ( ) , Box < dyn std ::error ::Error > > {
match self {
DiffEntry ::DiffResult ( diff ) = > diff . print_indented ( indentation , original_document ) ,
DiffEntry ::DiffLayer ( diff ) = > diff . print_indented ( indentation , original_document ) ,
}
}
}
impl < ' s > DiffResult < ' s > {
2023-08-29 14:40:58 -04:00
fn print_indented (
& self ,
indentation : usize ,
original_document : & str ,
) -> Result < ( ) , Box < dyn std ::error ::Error > > {
2023-04-11 19:22:42 -04:00
let status_text = {
match self . status {
DiffStatus ::Good = > {
if self . has_bad_children ( ) {
2023-08-25 04:09:52 -04:00
format! (
" {color}BADCHILD{reset} " ,
color = DiffResult ::foreground_color ( 255 , 255 , 0 ) ,
reset = DiffResult ::reset_color ( ) ,
)
2023-04-11 19:22:42 -04:00
} else {
2023-08-25 04:09:52 -04:00
format! (
" {color}GOOD{reset} " ,
color = DiffResult ::foreground_color ( 0 , 255 , 0 ) ,
reset = DiffResult ::reset_color ( ) ,
)
2023-04-11 19:22:42 -04:00
}
2023-04-12 11:35:02 -04:00
}
2023-08-25 04:09:52 -04:00
DiffStatus ::Bad = > format! (
" {color}BAD{reset} " ,
color = DiffResult ::foreground_color ( 255 , 0 , 0 ) ,
reset = DiffResult ::reset_color ( ) ,
) ,
2023-04-11 19:22:42 -04:00
}
} ;
2023-08-29 14:40:58 -04:00
let rust_offset = self . rust_source . as_ptr ( ) as usize - original_document . as_ptr ( ) as usize ;
2023-08-29 21:49:16 -04:00
let preceding_text = & original_document [ .. rust_offset ] ;
2023-04-22 17:58:16 -04:00
println! (
2023-08-29 14:40:58 -04:00
" {indentation}{status_text} {name} char({char_offset}) {message} " ,
indentation = " " . repeat ( indentation ) ,
status_text = status_text ,
name = self . name ,
2023-08-29 21:49:16 -04:00
char_offset = preceding_text . chars ( ) . count ( ) + 1 ,
2023-08-29 14:40:58 -04:00
message = self . message . as_ref ( ) . map ( | m | m . as_str ( ) ) . unwrap_or ( " " )
2023-04-22 17:58:16 -04:00
) ;
2023-04-11 18:27:01 -04:00
for child in self . children . iter ( ) {
2023-08-29 14:40:58 -04:00
child . print_indented ( indentation + 1 , original_document ) ? ;
2023-04-11 18:27:01 -04:00
}
Ok ( ( ) )
}
2023-04-11 19:22:42 -04:00
2023-08-29 22:47:40 -04:00
fn has_bad_children ( & self ) -> bool {
2023-04-12 11:35:02 -04:00
self . children
. iter ( )
2023-08-29 22:47:40 -04:00
. any ( | child | child . is_immediately_bad ( ) | | child . has_bad_children ( ) )
2023-04-12 14:50:56 -04:00
}
2023-08-25 04:09:52 -04:00
fn foreground_color ( red : u8 , green : u8 , blue : u8 ) -> String {
2023-08-25 04:25:39 -04:00
if DiffResult ::should_use_color ( ) {
format! (
" \x1b [38;2;{red};{green};{blue}m " ,
red = red ,
green = green ,
blue = blue
)
} else {
String ::new ( )
}
2023-08-25 04:09:52 -04:00
}
#[ allow(dead_code) ]
fn background_color ( red : u8 , green : u8 , blue : u8 ) -> String {
2023-08-25 04:25:39 -04:00
if DiffResult ::should_use_color ( ) {
format! (
" \x1b [48;2;{red};{green};{blue}m " ,
red = red ,
green = green ,
blue = blue
)
} else {
String ::new ( )
}
2023-08-25 04:09:52 -04:00
}
fn reset_color ( ) -> & 'static str {
2023-08-25 04:25:39 -04:00
if DiffResult ::should_use_color ( ) {
" \x1b [0m "
} else {
" "
}
}
fn should_use_color ( ) -> bool {
! std ::env ::var ( " NO_COLOR " ) . is_ok_and ( | val | ! val . is_empty ( ) )
2023-08-25 04:09:52 -04:00
}
2023-04-11 17:35:09 -04:00
}
2023-08-29 22:47:40 -04:00
impl < ' s > DiffLayer < ' s > {
fn has_bad_children ( & self ) -> bool {
self . children
. iter ( )
. any ( | child | child . is_immediately_bad ( ) | | child . has_bad_children ( ) )
}
fn print_indented (
& self ,
indentation : usize ,
original_document : & str ,
) -> Result < ( ) , Box < dyn std ::error ::Error > > {
let status_text = if self . has_bad_children ( ) {
format! (
" {color}BADCHILD{reset} " ,
color = DiffResult ::foreground_color ( 255 , 255 , 0 ) ,
reset = DiffResult ::reset_color ( ) ,
)
} else {
format! (
" {color}GOOD{reset} " ,
color = DiffResult ::foreground_color ( 0 , 255 , 0 ) ,
reset = DiffResult ::reset_color ( ) ,
)
} ;
println! (
" {indentation}{status_text} {name} " ,
indentation = " " . repeat ( indentation ) ,
status_text = status_text ,
name = self . name ,
) ;
for child in self . children . iter ( ) {
child . print_indented ( indentation + 1 , original_document ) ? ;
}
Ok ( ( ) )
}
}
2023-08-29 19:22:11 -04:00
fn artificial_diff_scope < ' s > (
2023-09-23 21:03:12 -04:00
name : & 'static str ,
2023-08-29 22:47:40 -04:00
children : Vec < DiffEntry < ' s > > ,
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
Ok ( DiffLayer {
name : name . into ( ) ,
children ,
}
. into ( ) )
2023-08-29 19:22:11 -04:00
}
2023-04-22 17:58:16 -04:00
fn compare_element < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s Element < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-08-29 14:17:47 -04:00
let compare_result = match rust {
2023-04-22 17:58:16 -04:00
Element ::Paragraph ( obj ) = > compare_paragraph ( source , emacs , obj ) ,
Element ::PlainList ( obj ) = > compare_plain_list ( source , emacs , obj ) ,
Element ::GreaterBlock ( obj ) = > compare_greater_block ( source , emacs , obj ) ,
Element ::DynamicBlock ( obj ) = > compare_dynamic_block ( source , emacs , obj ) ,
Element ::FootnoteDefinition ( obj ) = > compare_footnote_definition ( source , emacs , obj ) ,
Element ::Comment ( obj ) = > compare_comment ( source , emacs , obj ) ,
Element ::Drawer ( obj ) = > compare_drawer ( source , emacs , obj ) ,
Element ::PropertyDrawer ( obj ) = > compare_property_drawer ( source , emacs , obj ) ,
Element ::Table ( obj ) = > compare_table ( source , emacs , obj ) ,
Element ::VerseBlock ( obj ) = > compare_verse_block ( source , emacs , obj ) ,
Element ::CommentBlock ( obj ) = > compare_comment_block ( source , emacs , obj ) ,
Element ::ExampleBlock ( obj ) = > compare_example_block ( source , emacs , obj ) ,
Element ::ExportBlock ( obj ) = > compare_export_block ( source , emacs , obj ) ,
Element ::SrcBlock ( obj ) = > compare_src_block ( source , emacs , obj ) ,
Element ::Clock ( obj ) = > compare_clock ( source , emacs , obj ) ,
Element ::DiarySexp ( obj ) = > compare_diary_sexp ( source , emacs , obj ) ,
Element ::Planning ( obj ) = > compare_planning ( source , emacs , obj ) ,
Element ::FixedWidthArea ( obj ) = > compare_fixed_width_area ( source , emacs , obj ) ,
Element ::HorizontalRule ( obj ) = > compare_horizontal_rule ( source , emacs , obj ) ,
Element ::Keyword ( obj ) = > compare_keyword ( source , emacs , obj ) ,
2023-09-06 18:04:53 -04:00
Element ::BabelCall ( obj ) = > compare_babel_call ( source , emacs , obj ) ,
2023-04-22 17:58:16 -04:00
Element ::LatexEnvironment ( obj ) = > compare_latex_environment ( source , emacs , obj ) ,
2023-08-29 14:17:47 -04:00
} ;
2023-09-23 19:35:12 -04:00
let mut compare_result = match compare_result . unwrap_or_else ( | e | {
DiffResult {
2023-08-29 14:17:47 -04:00
status : DiffStatus ::Bad ,
2023-09-23 21:03:12 -04:00
name : " error! " . into ( ) ,
2023-08-29 14:17:47 -04:00
message : Some ( e . to_string ( ) ) ,
children : Vec ::new ( ) ,
2023-09-23 19:13:01 -04:00
rust_source : rust . get_standard_properties ( ) . get_source ( ) ,
2023-08-29 14:40:58 -04:00
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
2023-09-23 19:35:12 -04:00
. into ( )
} ) {
DiffEntry ::DiffResult ( inner ) = > inner ,
DiffEntry ::DiffLayer ( _ ) = > {
unreachable! ( " Layers are only interior to DiffResults of AST nodes. " )
}
} ;
2023-09-23 21:03:12 -04:00
match compare_standard_properties ( source , emacs , rust ) {
2023-09-23 19:35:12 -04:00
Err ( err ) = > {
compare_result . status = DiffStatus ::Bad ;
compare_result . message = Some ( err . to_string ( ) )
}
Ok ( _ ) = > { }
2023-04-22 17:58:16 -04:00
}
2023-09-23 19:35:12 -04:00
Ok ( compare_result . into ( ) )
2023-04-22 17:58:16 -04:00
}
fn compare_object < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s Object < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-08-29 14:17:47 -04:00
let compare_result = match rust {
2023-04-22 20:22:07 -04:00
Object ::Bold ( obj ) = > compare_bold ( source , emacs , obj ) ,
Object ::Italic ( obj ) = > compare_italic ( source , emacs , obj ) ,
Object ::Underline ( obj ) = > compare_underline ( source , emacs , obj ) ,
Object ::Verbatim ( obj ) = > compare_verbatim ( source , emacs , obj ) ,
Object ::Code ( obj ) = > compare_code ( source , emacs , obj ) ,
Object ::StrikeThrough ( obj ) = > compare_strike_through ( source , emacs , obj ) ,
2023-04-22 17:58:16 -04:00
Object ::PlainText ( obj ) = > compare_plain_text ( source , emacs , obj ) ,
Object ::RegularLink ( obj ) = > compare_regular_link ( source , emacs , obj ) ,
2023-04-24 18:55:15 -04:00
Object ::RadioLink ( obj ) = > compare_radio_link ( source , emacs , obj ) ,
Object ::RadioTarget ( obj ) = > compare_radio_target ( source , emacs , obj ) ,
2023-07-13 18:18:07 -04:00
Object ::PlainLink ( obj ) = > compare_plain_link ( source , emacs , obj ) ,
2023-07-13 22:42:42 -04:00
Object ::AngleLink ( obj ) = > compare_angle_link ( source , emacs , obj ) ,
2023-07-13 23:26:51 -04:00
Object ::OrgMacro ( obj ) = > compare_org_macro ( source , emacs , obj ) ,
2023-07-18 20:05:39 -04:00
Object ::Entity ( obj ) = > compare_entity ( source , emacs , obj ) ,
2023-07-18 20:51:06 -04:00
Object ::LatexFragment ( obj ) = > compare_latex_fragment ( source , emacs , obj ) ,
2023-07-19 00:09:16 -04:00
Object ::ExportSnippet ( obj ) = > compare_export_snippet ( source , emacs , obj ) ,
2023-07-19 18:56:46 -04:00
Object ::FootnoteReference ( obj ) = > compare_footnote_reference ( source , emacs , obj ) ,
2023-07-20 00:38:16 -04:00
Object ::Citation ( obj ) = > compare_citation ( source , emacs , obj ) ,
Object ::CitationReference ( obj ) = > compare_citation_reference ( source , emacs , obj ) ,
2023-07-21 19:53:02 -04:00
Object ::InlineBabelCall ( obj ) = > compare_inline_babel_call ( source , emacs , obj ) ,
2023-07-21 22:29:04 -04:00
Object ::InlineSourceBlock ( obj ) = > compare_inline_source_block ( source , emacs , obj ) ,
2023-07-21 23:48:37 -04:00
Object ::LineBreak ( obj ) = > compare_line_break ( source , emacs , obj ) ,
2023-07-22 01:15:04 -04:00
Object ::Target ( obj ) = > compare_target ( source , emacs , obj ) ,
2023-07-22 01:49:07 -04:00
Object ::StatisticsCookie ( obj ) = > compare_statistics_cookie ( source , emacs , obj ) ,
2023-07-24 14:19:19 -04:00
Object ::Subscript ( obj ) = > compare_subscript ( source , emacs , obj ) ,
Object ::Superscript ( obj ) = > compare_superscript ( source , emacs , obj ) ,
2023-07-24 17:34:07 -04:00
Object ::Timestamp ( obj ) = > compare_timestamp ( source , emacs , obj ) ,
2023-08-29 14:17:47 -04:00
} ;
2023-09-23 19:35:12 -04:00
let mut compare_result = match compare_result . unwrap_or_else ( | e | {
DiffResult {
2023-08-29 14:17:47 -04:00
status : DiffStatus ::Bad ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_fact ( ) . get_elisp_name ( ) ,
2023-08-29 14:17:47 -04:00
message : Some ( e . to_string ( ) ) ,
children : Vec ::new ( ) ,
2023-09-23 19:13:01 -04:00
rust_source : rust . get_standard_properties ( ) . get_source ( ) ,
2023-08-29 14:40:58 -04:00
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
2023-09-23 19:35:12 -04:00
. into ( )
} ) {
DiffEntry ::DiffResult ( inner ) = > inner ,
DiffEntry ::DiffLayer ( _ ) = > {
unreachable! ( " Layers are only interior to DiffResults of AST nodes. " )
}
} ;
// PlainText is a special case because upstream Org-Mode uses relative values for the bounds in plaintext rather than absolute so the below checks do not account for that.
if let Object ::PlainText ( _ ) = rust {
} else {
2023-09-23 21:03:12 -04:00
match compare_standard_properties ( source , emacs , rust ) {
2023-09-23 19:35:12 -04:00
Err ( err ) = > {
compare_result . status = DiffStatus ::Bad ;
compare_result . message = Some ( err . to_string ( ) )
}
Ok ( _ ) = > { }
}
2023-04-22 17:58:16 -04:00
}
2023-09-23 19:35:12 -04:00
Ok ( compare_result . into ( ) )
2023-04-22 17:58:16 -04:00
}
2023-09-11 13:13:28 -04:00
pub fn compare_document < ' s > (
2023-04-11 17:35:09 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Document < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-11 17:35:09 -04:00
let children = emacs . as_list ( ) ? ;
2023-04-11 18:27:01 -04:00
let mut child_status = Vec ::new ( ) ;
2023-04-11 19:16:04 -04:00
let mut this_status = DiffStatus ::Good ;
2023-09-23 21:03:12 -04:00
let mut message = None ;
match compare_standard_properties ( rust . source , emacs , rust ) {
Err ( err ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( err . to_string ( ) )
}
Ok ( _ ) = > { }
2023-04-19 15:38:36 -04:00
}
2023-04-11 17:35:09 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :path :CATEGORY
// Skipping "org-data" and its properties
2023-04-11 18:27:01 -04:00
for ( i , token ) in children . iter ( ) . skip ( 2 ) . enumerate ( ) {
let section_or_headline = token . as_list ( ) ? ;
let first_cell = section_or_headline
. first ( )
. ok_or ( " Should have at least one child. " ) ?
. as_atom ( ) ? ;
if first_cell = = " section " {
if i ! = 0 {
return Err ( " Section cannot be after the first child of document. " . into ( ) ) ;
}
child_status . push ( compare_section (
2023-04-11 18:34:11 -04:00
rust . source ,
2023-04-11 18:27:01 -04:00
token ,
rust . zeroth_section
. as_ref ( )
. ok_or ( " No corresponding zeroth-section " ) ? ,
) ? ) ;
} else if first_cell = = " headline " {
let corresponding_heading = rust
. children
. iter ( )
. nth ( i - rust . zeroth_section . as_ref ( ) . map ( | _ | 1 ) . unwrap_or ( 0 ) )
. ok_or ( " Should have a corresponding heading. " ) ? ;
2023-04-11 19:16:04 -04:00
child_status . push ( compare_heading ( rust . source , token , corresponding_heading ) ? ) ;
2023-04-11 18:27:01 -04:00
} else {
return Err ( " Document should only contain sections and headlines. " . into ( ) ) ;
}
}
Ok ( DiffResult {
2023-04-11 19:16:04 -04:00
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
message ,
2023-04-11 18:27:01 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-11 18:27:01 -04:00
}
2023-04-12 13:16:25 -04:00
fn compare_section < ' s > (
2023-04-11 18:34:11 -04:00
source : & ' s str ,
2023-04-11 18:27:01 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Section < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-11 18:27:01 -04:00
let children = emacs . as_list ( ) ? ;
2023-04-11 19:16:04 -04:00
let mut this_status = DiffStatus ::Good ;
2023-04-19 15:38:36 -04:00
let mut child_status = Vec ::new ( ) ;
2023-08-29 21:05:51 -04:00
let mut message = None ;
2023-04-11 19:16:04 -04:00
2023-09-23 21:03:12 -04:00
match compare_standard_properties ( source , emacs , rust ) {
2023-08-29 21:05:51 -04:00
Err ( err ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( err . to_string ( ) )
}
Ok ( _ ) = > { }
2023-09-23 21:03:12 -04:00
}
2023-04-12 11:46:49 -04:00
for ( emacs_child , rust_child ) in children . iter ( ) . skip ( 2 ) . zip ( rust . children . iter ( ) ) {
child_status . push ( compare_element ( source , emacs_child , rust_child ) ? ) ;
}
2023-04-11 18:27:01 -04:00
Ok ( DiffResult {
2023-04-11 19:16:04 -04:00
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-11 18:27:01 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-11 18:27:01 -04:00
}
2023-04-12 13:16:25 -04:00
fn compare_heading < ' s > (
2023-04-11 18:34:11 -04:00
source : & ' s str ,
2023-04-11 18:27:01 -04:00
emacs : & ' s Token < ' s > ,
2023-04-11 19:16:04 -04:00
rust : & ' s Heading < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-11 18:27:01 -04:00
let children = emacs . as_list ( ) ? ;
let mut child_status = Vec ::new ( ) ;
2023-04-11 19:16:04 -04:00
let mut this_status = DiffStatus ::Good ;
2023-08-25 06:46:00 -04:00
let mut message = None ;
2023-04-11 19:16:04 -04:00
2023-09-23 21:03:12 -04:00
match compare_standard_properties ( source , emacs , rust ) {
2023-08-29 21:05:51 -04:00
Err ( err ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( err . to_string ( ) )
}
Ok ( _ ) = > { }
2023-09-23 21:03:12 -04:00
}
2023-04-11 18:27:01 -04:00
2023-08-29 22:07:23 -04:00
// Compare level
2023-08-29 22:11:56 -04:00
let level = get_property ( emacs , " :level " ) ?
. ok_or ( " Level should not be nil " ) ?
. as_atom ( ) ? ;
2023-09-15 22:44:39 -04:00
if rust . level . to_string ( ) ! = level {
2023-08-29 22:11:56 -04:00
this_status = DiffStatus ::Bad ;
message = Some ( format! (
2023-09-08 23:05:04 -04:00
" Headline level do not match (emacs != rust): {} != {} " ,
2023-09-15 22:44:39 -04:00
level , rust . level
2023-08-29 22:11:56 -04:00
) )
}
2023-08-29 22:07:23 -04:00
2023-08-27 15:56:08 -04:00
// Compare tags
let emacs_tags = get_tags_from_heading ( emacs ) ? ;
let emacs_tags : HashSet < _ > = emacs_tags . iter ( ) . map ( | val | val . as_str ( ) ) . collect ( ) ;
let rust_tags : HashSet < & str > = rust . tags . iter ( ) . map ( | val | * val ) . collect ( ) ;
let difference : Vec < & str > = emacs_tags
. symmetric_difference ( & rust_tags )
. map ( | val | * val )
. collect ( ) ;
if ! difference . is_empty ( ) {
this_status = DiffStatus ::Bad ;
message = Some ( format! ( " Mismatched tags: {} " , difference . join ( " , " ) ) ) ;
}
// Compare todo-keyword
2023-08-29 19:22:11 -04:00
let todo_keyword = get_property ( emacs , " :todo-keyword " ) ?
. map ( Token ::as_atom )
. map_or ( Ok ( None ) , | r | r . map ( Some ) ) ?
. unwrap_or ( " nil " ) ;
2023-09-06 12:39:03 -04:00
match ( todo_keyword , & rust . todo_keyword , unquote ( todo_keyword ) ) {
2023-08-27 15:56:08 -04:00
( " nil " , None , _ ) = > { }
2023-09-06 12:39:03 -04:00
( _ , Some ( ( _rust_todo_type , rust_todo ) ) , Ok ( emacs_todo ) ) if emacs_todo = = * rust_todo = > { }
2023-08-27 15:56:08 -04:00
( emacs_todo , rust_todo , _ ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" (emacs != rust) {:?} != {:?} " ,
emacs_todo , rust_todo
) ) ;
}
} ;
2023-09-06 12:39:03 -04:00
// Compare todo-type
let todo_type = get_property ( emacs , " :todo-type " ) ?
. map ( Token ::as_atom )
. map_or ( Ok ( None ) , | r | r . map ( Some ) ) ?
. unwrap_or ( " nil " ) ;
// todo-type is an unquoted string either todo, done, or nil
match ( todo_type , & rust . todo_keyword ) {
( " nil " , None ) = > { }
( " todo " , Some ( ( TodoKeywordType ::Todo , _ ) ) ) = > { }
( " done " , Some ( ( TodoKeywordType ::Done , _ ) ) ) = > { }
( emacs_todo , rust_todo ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" (emacs != rust) {:?} != {:?} " ,
emacs_todo , rust_todo
) ) ;
}
} ;
2023-08-27 15:56:08 -04:00
// Compare title
2023-09-14 01:41:09 -04:00
let title = get_property ( emacs , " :title " ) ? ;
match ( title , rust . title . len ( ) ) {
( None , 0 ) = > { }
( None , _ ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Titles do not match (emacs != rust): {:?} != {:?} " ,
title , rust . title
) )
}
( Some ( title ) , _ ) = > {
let title_status = title
. as_list ( ) ?
. iter ( )
. zip ( rust . title . iter ( ) )
. map ( | ( emacs_child , rust_child ) | compare_object ( source , emacs_child , rust_child ) )
. collect ::< Result < Vec < _ > , _ > > ( ) ? ;
2023-09-23 21:03:12 -04:00
child_status . push ( artificial_diff_scope ( " title " , title_status ) ? ) ;
2023-09-14 01:41:09 -04:00
}
} ;
2023-04-22 22:56:36 -04:00
2023-09-08 15:57:24 -04:00
// Compare priority
let priority = get_property ( emacs , " :priority " ) ? ;
match ( priority , rust . priority_cookie ) {
( None , None ) = > { }
( None , Some ( _ ) ) | ( Some ( _ ) , None ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Priority cookie mismatch (emacs != rust) {:?} != {:?} " ,
priority , rust . priority_cookie
) ) ;
}
( Some ( emacs_priority_cookie ) , Some ( rust_priority_cookie ) ) = > {
let emacs_priority_cookie =
emacs_priority_cookie . as_atom ( ) ? . parse ::< PriorityCookie > ( ) ? ;
if emacs_priority_cookie ! = rust_priority_cookie {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Priority cookie mismatch (emacs != rust) {:?} != {:?} " ,
emacs_priority_cookie , rust_priority_cookie
) ) ;
}
}
}
// Compare archived
let archived = get_property ( emacs , " :archivedp " ) ? ;
match ( archived , rust . is_archived ) {
( None , true ) | ( Some ( _ ) , false ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" archived mismatch (emacs != rust) {:?} != {:?} " ,
archived , rust . is_archived
) ) ;
}
( None , false ) | ( Some ( _ ) , true ) = > { }
}
// Compare commented
let commented = get_property ( emacs , " :commentedp " ) ? ;
match ( commented , rust . is_comment ) {
( None , true ) | ( Some ( _ ) , false ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" commented mismatch (emacs != rust) {:?} != {:?} " ,
commented , rust . is_comment
) ) ;
}
( None , false ) | ( Some ( _ ) , true ) = > { }
}
2023-09-23 14:46:36 -04:00
// TODO: Compare :pre-blank :raw-value :footnote-section-p :scheduled :closed
//
// :scheduled and :closed seem to only appear when the headline has a planning
2023-08-25 06:13:29 -04:00
2023-08-27 15:56:08 -04:00
// Compare section
2023-08-29 22:57:08 -04:00
let section_status = children
. iter ( )
. skip ( 2 )
. zip ( rust . children . iter ( ) )
. map ( | ( emacs_child , rust_child ) | match rust_child {
2023-04-12 11:35:02 -04:00
DocumentElement ::Heading ( rust_heading ) = > {
2023-08-29 22:57:08 -04:00
compare_heading ( source , emacs_child , rust_heading )
2023-04-12 13:16:25 -04:00
}
2023-04-12 11:35:02 -04:00
DocumentElement ::Section ( rust_section ) = > {
2023-08-29 22:57:08 -04:00
compare_section ( source , emacs_child , rust_section )
2023-04-12 13:16:25 -04:00
}
2023-08-29 22:57:08 -04:00
} )
. collect ::< Result < Vec < _ > , _ > > ( ) ? ;
2023-09-23 21:03:12 -04:00
child_status . push ( artificial_diff_scope ( " section " , section_status ) ? ) ;
2023-04-12 11:35:02 -04:00
2023-04-11 18:27:01 -04:00
Ok ( DiffResult {
2023-04-11 19:16:04 -04:00
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-25 06:46:00 -04:00
message ,
2023-04-11 18:27:01 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-11 17:35:09 -04:00
}
2023-04-12 11:46:49 -04:00
2023-08-25 06:46:00 -04:00
fn get_tags_from_heading < ' s > (
emacs : & ' s Token < ' s > ,
) -> Result < HashSet < String > , Box < dyn std ::error ::Error > > {
2023-08-29 19:22:11 -04:00
let tags = match get_property ( emacs , " :tags " ) ? {
Some ( prop ) = > prop ,
None = > return Ok ( HashSet ::new ( ) ) ,
} ;
2023-08-25 06:46:00 -04:00
match tags . as_atom ( ) {
Ok ( val ) = > panic! ( " Unexpected value for tags: {:?} " , val ) ,
Err ( _ ) = > { }
} ;
let tags = {
let tags = tags . as_list ( ) ? ;
2023-08-27 15:56:08 -04:00
let strings = tags
. iter ( )
. map ( Token ::as_atom )
. collect ::< Result < Vec < & str > , _ > > ( ) ? ;
strings
. into_iter ( )
. map ( unquote )
. collect ::< Result < HashSet < String > , _ > > ( ) ?
2023-08-25 06:46:00 -04:00
} ;
Ok ( tags )
}
2023-04-12 13:16:25 -04:00
fn compare_paragraph < ' s > (
2023-04-12 11:46:49 -04:00
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s Paragraph < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-12 11:46:49 -04:00
let children = emacs . as_list ( ) ? ;
2023-04-22 17:58:16 -04:00
let mut child_status = Vec ::new ( ) ;
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-12 11:46:49 -04:00
2023-04-22 17:58:16 -04:00
for ( emacs_child , rust_child ) in children . iter ( ) . skip ( 2 ) . zip ( rust . children . iter ( ) ) {
child_status . push ( compare_object ( source , emacs_child , rust_child ) ? ) ;
}
2023-04-12 11:46:49 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-12 11:46:49 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-12 11:46:49 -04:00
}
2023-04-12 13:16:25 -04:00
fn compare_plain_list < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s PlainList < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-12 13:16:25 -04:00
let children = emacs . as_list ( ) ? ;
let mut child_status = Vec ::new ( ) ;
2023-09-29 13:03:01 -04:00
let mut this_status = DiffStatus ::Good ;
let mut message = None ;
2023-09-29 18:45:38 -04:00
// Compare type
2023-09-21 20:58:03 -04:00
// :type is an unquoted atom of either descriptive, ordered, or unordered
2023-09-29 13:03:01 -04:00
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
) ) ;
}
}
2023-09-21 20:58:03 -04:00
2023-04-12 14:07:33 -04:00
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 ) ? ) ;
}
2023-04-12 13:16:25 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-12 13:16:25 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-12 13:16:25 -04:00
}
2023-04-12 14:07:33 -04:00
fn compare_plain_list_item < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s PlainListItem < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-12 14:07:33 -04:00
let children = emacs . as_list ( ) ? ;
let mut child_status = Vec ::new ( ) ;
let mut this_status = DiffStatus ::Good ;
2023-08-29 19:22:11 -04:00
let mut message = None ;
2023-09-23 21:03:12 -04:00
// This is not called from compare_element so we have to duplicate all the common checks here.
match compare_standard_properties ( source , emacs , rust ) {
2023-08-29 21:05:51 -04:00
Err ( err ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( err . to_string ( ) )
}
Ok ( _ ) = > { }
2023-09-23 21:03:12 -04:00
}
2023-04-12 14:07:33 -04:00
2023-08-29 19:22:11 -04:00
// Compare tag
let tag = get_property ( emacs , " :tag " ) ? ;
match ( tag , rust . tag . is_empty ( ) ) {
( None , true ) = > { }
( None , false ) | ( Some ( _ ) , true ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( " Mismatched tags " . to_owned ( ) ) ;
}
( Some ( tag ) , false ) = > {
let tag_status = tag
. as_list ( ) ?
. iter ( )
. zip ( rust . tag . iter ( ) )
. map ( | ( emacs_child , rust_child ) | compare_object ( source , emacs_child , rust_child ) )
. collect ::< Result < Vec < _ > , _ > > ( ) ? ;
2023-09-23 21:03:12 -04:00
child_status . push ( artificial_diff_scope ( " tag " , tag_status ) ? ) ;
2023-08-29 19:22:11 -04:00
}
} ;
// Compare contents
let contents_status = children
. iter ( )
. skip ( 2 )
. zip ( rust . children . iter ( ) )
. map ( | ( emacs_child , rust_child ) | compare_element ( source , emacs_child , rust_child ) )
. collect ::< Result < Vec < _ > , _ > > ( ) ? ;
2023-09-23 21:03:12 -04:00
child_status . push ( artificial_diff_scope ( " contents " , contents_status ) ? ) ;
2023-04-12 14:07:33 -04:00
2023-09-29 18:45:38 -04:00
// Compare bullet
2023-09-29 17:28:50 -04:00
let bullet = get_property_quoted_string ( emacs , " :bullet " ) ?
. ok_or ( " Plain list items must have a :bullet. " ) ? ;
if bullet ! = rust . bullet {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
2023-09-29 18:45:38 -04:00
" Bullet mismatch (emacs != rust) {:?} != {:?} " ,
2023-09-29 17:28:50 -04:00
bullet , rust . bullet
) ) ;
}
2023-09-15 15:30:13 -04:00
2023-09-29 18:45:38 -04:00
// Compare counter
let counter = get_property_unquoted_atom ( emacs , " :counter " ) ? ;
let counter : Option < PlainListItemCounter > = counter
. map ( | val | val . parse ( ) )
. map_or ( Ok ( None ) , | r | r . map ( Some ) ) ? ;
match ( counter , rust . counter ) {
( None , None ) = > { }
( None , Some ( _ ) ) | ( Some ( _ ) , None ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Counter mismatch (emacs != rust) {:?} != {:?} " ,
counter , rust . counter
) ) ;
}
( Some ( e ) , Some ( r ) ) if e ! = r = > {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Counter mismatch (emacs != rust) {:?} != {:?} " ,
counter , rust . counter
) ) ;
}
( Some ( _ ) , Some ( _ ) ) = > { }
} ;
2023-09-15 15:30:13 -04:00
// Compare checkbox
let checkbox = get_property ( emacs , " :checkbox " ) ?
. map ( Token ::as_atom )
. map_or ( Ok ( None ) , | r | r . map ( Some ) ) ?
. unwrap_or ( " nil " ) ;
match ( checkbox , & rust . checkbox ) {
( " nil " , None ) = > { }
( " off " , Some ( ( CheckboxType ::Off , _ ) ) ) = > { }
( " trans " , Some ( ( CheckboxType ::Trans , _ ) ) ) = > { }
( " on " , Some ( ( CheckboxType ::On , _ ) ) ) = > { }
_ = > {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Checkbox mismatch (emacs != rust) {:?} != {:?} " ,
checkbox , rust . checkbox
) ) ;
}
} ;
2023-09-06 19:09:20 -04:00
2023-09-29 19:30:02 -04:00
// Compare pre-blank
// :pre-blank appears to count the line breaks between "::" and the contents in a descriptive list. Oddly enough it does not count the spaces so I'm not quite sure what the value is.
let pre_blank = get_property_unquoted_atom ( emacs , " :pre-blank " ) ? ;
let pre_blank : Option < PlainListItemPreBlank > = pre_blank
. map ( | val | val . parse ( ) )
. map_or ( Ok ( None ) , | r | r . map ( Some ) ) ? ;
if pre_blank . unwrap_or ( 0 ) ! = rust . pre_blank {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Pre-blank mismatch (emacs != rust) {:?} != {:?} " ,
pre_blank , rust . pre_blank
) ) ;
}
2023-09-29 18:45:38 -04:00
2023-04-12 14:07:33 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 19:22:11 -04:00
message ,
2023-04-12 14:07:33 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-12 14:07:33 -04:00
}
2023-04-12 13:45:22 -04:00
fn compare_greater_block < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s GreaterBlock < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-12 13:45:22 -04:00
let children = emacs . as_list ( ) ? ;
2023-04-19 15:38:36 -04:00
let mut child_status = Vec ::new ( ) ;
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-09-23 14:46:36 -04:00
// TODO: Special block compare :type :parameters
// Center and quote block has no additional properties
2023-04-12 13:45:22 -04:00
for ( emacs_child , rust_child ) in children . iter ( ) . skip ( 2 ) . zip ( rust . children . iter ( ) ) {
child_status . push ( compare_element ( source , emacs_child , rust_child ) ? ) ;
}
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-12 13:45:22 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-19 13:59:17 -04:00
}
fn compare_dynamic_block < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s DynamicBlock < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-19 13:59:17 -04:00
let children = emacs . as_list ( ) ? ;
let mut child_status = Vec ::new ( ) ;
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-09-20 02:37:26 -04:00
// TODO: Compare :block-name :arguments
2023-04-19 13:59:17 -04:00
for ( emacs_child , rust_child ) in children . iter ( ) . skip ( 2 ) . zip ( rust . children . iter ( ) ) {
child_status . push ( compare_element ( source , emacs_child , rust_child ) ? ) ;
}
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-19 13:59:17 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-12 13:45:22 -04:00
}
fn compare_footnote_definition < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s FootnoteDefinition < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-12 13:45:22 -04:00
let children = emacs . as_list ( ) ? ;
let mut child_status = Vec ::new ( ) ;
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-09-23 14:46:36 -04:00
// TODO: Compare :label :pre-blank
2023-04-12 13:45:22 -04:00
for ( emacs_child , rust_child ) in children . iter ( ) . skip ( 2 ) . zip ( rust . children . iter ( ) ) {
child_status . push ( compare_element ( source , emacs_child , rust_child ) ? ) ;
}
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-12 13:45:22 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-12 13:45:22 -04:00
}
2023-04-15 16:53:58 -04:00
fn compare_comment < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-15 16:53:58 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Comment < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-21 18:42:31 -04:00
let child_status = Vec ::new ( ) ;
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-09-23 14:46:36 -04:00
// TODO: Compare :value
2023-04-15 16:53:58 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-15 16:53:58 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-15 16:53:58 -04:00
}
2023-04-15 18:00:34 -04:00
fn compare_drawer < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s Drawer < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-15 18:00:34 -04:00
let children = emacs . as_list ( ) ? ;
let mut child_status = Vec ::new ( ) ;
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-09-23 14:46:36 -04:00
// TODO: Compare :drawer-name
2023-04-15 18:00:34 -04:00
for ( emacs_child , rust_child ) in children . iter ( ) . skip ( 2 ) . zip ( rust . children . iter ( ) ) {
child_status . push ( compare_element ( source , emacs_child , rust_child ) ? ) ;
}
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-15 18:00:34 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-15 18:00:34 -04:00
}
2023-04-19 16:51:00 -04:00
fn compare_property_drawer < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s PropertyDrawer < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-19 16:51:00 -04:00
let children = emacs . as_list ( ) ? ;
2023-09-06 18:49:59 -04:00
let mut child_status = Vec ::new ( ) ;
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-19 16:51:00 -04:00
2023-09-06 18:49:59 -04:00
for ( emacs_child , rust_child ) in children . iter ( ) . skip ( 2 ) . zip ( rust . children . iter ( ) ) {
child_status . push ( compare_node_property ( source , emacs_child , rust_child ) ? ) ;
2023-04-19 16:51:00 -04:00
}
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-19 16:51:00 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-19 16:51:00 -04:00
}
2023-04-19 20:59:58 -04:00
2023-09-06 18:49:59 -04:00
fn compare_node_property < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s NodeProperty < ' s > ,
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
let child_status = Vec ::new ( ) ;
let mut this_status = DiffStatus ::Good ;
let mut message = None ;
2023-09-23 21:03:12 -04:00
// This is not called from compare_element so we must duplicate all the tests here.
match compare_standard_properties ( source , emacs , rust ) {
2023-09-06 18:49:59 -04:00
Err ( err ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( err . to_string ( ) )
}
Ok ( _ ) = > { }
2023-09-23 21:03:12 -04:00
}
2023-09-06 18:49:59 -04:00
// TODO: Compare :key :value
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-09-06 18:49:59 -04:00
message ,
children : child_status ,
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
}
. into ( ) )
}
2023-04-19 20:59:58 -04:00
fn compare_table < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s Table < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-19 20:59:58 -04:00
let children = emacs . as_list ( ) ? ;
let mut child_status = Vec ::new ( ) ;
let mut this_status = DiffStatus ::Good ;
2023-08-29 21:05:51 -04:00
let mut message = None ;
2023-04-19 20:59:58 -04:00
2023-09-08 23:05:04 -04:00
// Compare formulas
2023-09-08 22:42:24 -04:00
//
2023-09-08 23:05:04 -04:00
// :tblfm is either nil or a list () filled with quoted strings containing the value for any tblfm keywords at the end of the table.
let emacs_formulas = get_property ( emacs , " :tblfm " ) ? ;
if let Some ( emacs_formulas ) = emacs_formulas {
let emacs_formulas = emacs_formulas . as_list ( ) ? ;
if emacs_formulas . len ( ) ! = rust . formulas . len ( ) {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Formulas do not match (emacs != rust): {:?} != {:?} " ,
emacs_formulas , rust . formulas
) )
} else {
let atoms = emacs_formulas
. into_iter ( )
. map ( Token ::as_atom )
. collect ::< Result < Vec < _ > , _ > > ( ) ? ;
let unquoted = atoms
. into_iter ( )
. map ( unquote )
. collect ::< Result < BTreeSet < _ > , _ > > ( ) ? ;
for kw in & rust . formulas {
if ! unquoted . contains ( kw . value ) {
this_status = DiffStatus ::Bad ;
message = Some ( format! ( " Could not find formula in emacs: {} " , kw . value ) )
}
}
}
} else {
if ! rust . formulas . is_empty ( ) {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Formulas do not match (emacs != rust): {:?} != {:?} " ,
emacs_formulas , rust . formulas
) )
}
}
2023-09-08 22:42:24 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :type :value
2023-04-21 15:45:35 -04:00
for ( emacs_child , rust_child ) in children . iter ( ) . skip ( 2 ) . zip ( rust . children . iter ( ) ) {
child_status . push ( compare_table_row ( source , emacs_child , rust_child ) ? ) ;
}
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 15:45:35 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 15:45:35 -04:00
}
fn compare_table_row < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s TableRow < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-21 15:45:35 -04:00
let children = emacs . as_list ( ) ? ;
let mut child_status = Vec ::new ( ) ;
let mut this_status = DiffStatus ::Good ;
2023-08-29 21:05:51 -04:00
let mut message = None ;
2023-09-23 21:03:12 -04:00
// This is not called from compare_element so we must duplicate all the tests here.
match compare_standard_properties ( source , emacs , rust ) {
2023-08-29 21:05:51 -04:00
Err ( err ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( err . to_string ( ) )
}
Ok ( _ ) = > { }
2023-09-23 21:03:12 -04:00
}
2023-04-21 15:45:35 -04:00
2023-09-08 22:42:24 -04:00
// TODO: Compare :type
//
// :type is an unquoted atom of either standard or rule
2023-04-21 15:45:35 -04:00
for ( emacs_child , rust_child ) in children . iter ( ) . skip ( 2 ) . zip ( rust . children . iter ( ) ) {
child_status . push ( compare_table_cell ( source , emacs_child , rust_child ) ? ) ;
}
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 15:45:35 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 15:45:35 -04:00
}
fn compare_table_cell < ' s > (
source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s TableCell < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-21 15:45:35 -04:00
let children = emacs . as_list ( ) ? ;
2023-04-21 18:42:31 -04:00
let child_status = Vec ::new ( ) ;
2023-04-21 15:45:35 -04:00
let mut this_status = DiffStatus ::Good ;
2023-08-29 21:05:51 -04:00
let mut message = None ;
2023-09-23 21:03:12 -04:00
// This is not called from compare_object so we must duplicate all the tests here.
match compare_standard_properties ( source , emacs , rust ) {
2023-08-29 21:05:51 -04:00
Err ( err ) = > {
this_status = DiffStatus ::Bad ;
message = Some ( err . to_string ( ) )
}
Ok ( _ ) = > { }
2023-09-23 21:03:12 -04:00
}
2023-04-21 15:45:35 -04:00
2023-04-21 18:42:31 -04:00
for ( _emacs_child , _rust_child ) in children . iter ( ) . skip ( 2 ) . zip ( rust . children . iter ( ) ) { }
2023-04-21 15:45:35 -04:00
2023-04-19 20:59:58 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-19 20:59:58 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-19 20:59:58 -04:00
}
2023-04-21 16:31:25 -04:00
2023-04-21 17:40:49 -04:00
fn compare_verse_block < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-21 16:31:25 -04:00
emacs : & ' s Token < ' s > ,
2023-04-21 17:40:49 -04:00
rust : & ' s VerseBlock < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-21 18:05:40 -04:00
let children = emacs . as_list ( ) ? ;
2023-04-21 18:42:31 -04:00
let child_status = Vec ::new ( ) ;
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-21 18:05:40 -04:00
2023-04-21 18:42:31 -04:00
for ( _emacs_child , _rust_child ) in children . iter ( ) . skip ( 2 ) . zip ( rust . children . iter ( ) ) { }
2023-04-21 18:05:40 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 18:05:40 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 17:40:49 -04:00
}
fn compare_comment_block < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-21 17:40:49 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s CommentBlock < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-21 18:05:40 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :value
2023-04-21 18:05:40 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 18:05:40 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 17:40:49 -04:00
}
fn compare_example_block < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-21 17:40:49 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s ExampleBlock < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-21 18:05:40 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :value :switches :number-lines :preserve-indent :retain-labels :use-labels :label-fmt
2023-04-21 18:05:40 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 18:05:40 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 17:40:49 -04:00
}
fn compare_export_block < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-21 17:40:49 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s ExportBlock < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-21 18:05:40 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :type :value
2023-04-21 18:05:40 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 18:05:40 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 17:40:49 -04:00
}
fn compare_src_block < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-21 17:40:49 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s SrcBlock < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-21 18:05:40 -04:00
2023-09-06 18:11:57 -04:00
// TODO: Compare :language :switches :parameters :number-lines :preserve-indent :retain-labels :use-labels :label-fmt :value
2023-04-21 18:05:40 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 18:05:40 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 16:31:25 -04:00
}
2023-04-21 19:02:16 -04:00
fn compare_clock < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-21 19:02:16 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Clock < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-21 19:02:16 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :status :value :duration
2023-04-21 19:02:16 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 19:02:16 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 19:02:16 -04:00
}
2023-04-21 20:22:31 -04:00
fn compare_diary_sexp < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-21 20:22:31 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s DiarySexp < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-21 20:22:31 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :value
2023-04-21 20:22:31 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 20:22:31 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 20:22:31 -04:00
}
2023-04-21 21:33:23 -04:00
fn compare_planning < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-21 21:33:23 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Planning < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-21 21:33:23 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :closed :deadline :scheduled
2023-04-21 21:33:23 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 21:33:23 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 21:33:23 -04:00
}
2023-04-21 22:04:22 -04:00
fn compare_fixed_width_area < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-21 22:04:22 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s FixedWidthArea < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-21 22:04:22 -04:00
let child_status = Vec ::new ( ) ;
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-21 22:04:22 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :value
2023-04-21 22:04:22 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 22:04:22 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 22:04:22 -04:00
}
2023-04-21 22:23:59 -04:00
fn compare_horizontal_rule < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-21 22:23:59 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s HorizontalRule < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-21 22:23:59 -04:00
let child_status = Vec ::new ( ) ;
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-21 22:23:59 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 22:23:59 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 22:23:59 -04:00
}
2023-04-21 22:33:10 -04:00
fn compare_keyword < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-21 22:33:10 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Keyword < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-21 22:33:10 -04:00
let child_status = Vec ::new ( ) ;
let mut this_status = DiffStatus ::Good ;
2023-08-29 21:05:51 -04:00
let mut message = None ;
2023-04-21 22:33:10 -04:00
2023-09-06 12:08:06 -04:00
let key = unquote (
get_property ( emacs , " :key " ) ?
. ok_or ( " Emacs keywords should have a :key " ) ?
. as_atom ( ) ? ,
) ? ;
if key ! = rust . key . to_uppercase ( ) {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Mismatchs keyword keys (emacs != rust) {:?} != {:?} " ,
key , rust . key
) )
}
let value = unquote (
get_property ( emacs , " :value " ) ?
. ok_or ( " Emacs keywords should have a :value " ) ?
. as_atom ( ) ? ,
) ? ;
if value ! = rust . value {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Mismatchs keyword values (emacs != rust) {:?} != {:?} " ,
value , rust . value
) )
}
2023-09-04 19:17:23 -04:00
2023-09-06 18:04:53 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-09-06 18:04:53 -04:00
message ,
children : child_status ,
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
}
. into ( ) )
}
fn compare_babel_call < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-09-06 18:04:53 -04:00
emacs : & ' s Token < ' s > ,
2023-09-23 21:03:12 -04:00
rust : & ' s BabelCall < ' s > ,
2023-09-06 18:04:53 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
let child_status = Vec ::new ( ) ;
let mut this_status = DiffStatus ::Good ;
let mut message = None ;
2023-09-23 14:46:36 -04:00
// TODO: Compare :call :inside-header :arguments :end-header
2023-09-06 18:04:53 -04:00
let value = unquote (
get_property ( emacs , " :value " ) ?
. ok_or ( " Emacs keywords should have a :value " ) ?
. as_atom ( ) ? ,
) ? ;
if value ! = rust . value {
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" Mismatchs keyword values (emacs != rust) {:?} != {:?} " ,
value , rust . value
) )
}
2023-04-21 22:33:10 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-21 22:33:10 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-21 22:33:10 -04:00
}
2023-04-22 16:56:36 -04:00
fn compare_latex_environment < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-22 16:56:36 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s LatexEnvironment < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-22 16:56:36 -04:00
let child_status = Vec ::new ( ) ;
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-22 16:56:36 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :value
2023-04-22 16:56:36 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-22 16:56:36 -04:00
children : child_status ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-22 16:56:36 -04:00
}
2023-04-22 17:58:16 -04:00
fn compare_plain_text < ' s > (
_source : & ' s str ,
emacs : & ' s Token < ' s > ,
rust : & ' s PlainText < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-04-22 17:58:16 -04:00
let mut this_status = DiffStatus ::Good ;
let mut message = None ;
2023-08-29 19:22:11 -04:00
let rust_source = rust . get_source ( ) ;
2023-04-22 17:58:16 -04:00
let text = emacs . as_text ( ) ? ;
2023-04-24 18:55:15 -04:00
let start_ind : usize = text
. properties
. get ( 0 )
. expect ( " Should have start index. " )
. as_atom ( ) ?
. parse ( ) ? ;
let end_ind : usize = text
. properties
. get ( 1 )
. expect ( " Should have end index. " )
. as_atom ( ) ?
. parse ( ) ? ;
let emacs_text_length = end_ind - start_ind ;
2023-08-31 20:19:28 -04:00
if rust_source . chars ( ) . count ( ) ! = emacs_text_length {
2023-04-24 18:21:38 -04:00
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" (emacs len != rust len) {:?} != {:?} " ,
2023-04-24 18:55:15 -04:00
emacs_text_length ,
2023-08-29 19:22:11 -04:00
rust_source . len ( )
2023-04-24 18:21:38 -04:00
) ) ;
}
2023-08-25 06:46:00 -04:00
let unquoted_text = unquote ( text . text ) ? ;
2023-08-29 19:22:11 -04:00
if unquoted_text ! = rust_source {
2023-04-22 17:58:16 -04:00
this_status = DiffStatus ::Bad ;
message = Some ( format! (
" (emacs != rust) {:?} != {:?} " ,
2023-08-29 19:22:11 -04:00
unquoted_text , rust_source
2023-04-22 17:58:16 -04:00
) ) ;
}
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-04-22 17:58:16 -04:00
message ,
children : Vec ::new ( ) ,
2023-08-29 19:22:11 -04:00
rust_source ,
2023-08-29 14:40:58 -04:00
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-22 17:58:16 -04:00
}
2023-04-22 20:22:07 -04:00
fn compare_bold < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-22 17:58:16 -04:00
emacs : & ' s Token < ' s > ,
2023-04-22 20:22:07 -04:00
rust : & ' s Bold < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-22 20:48:01 -04:00
2023-04-22 17:58:16 -04:00
Ok ( DiffResult {
2023-04-22 20:48:01 -04:00
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-22 20:22:07 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-22 20:22:07 -04:00
}
fn compare_italic < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-22 20:22:07 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Italic < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-22 20:48:01 -04:00
2023-04-22 20:22:07 -04:00
Ok ( DiffResult {
2023-04-22 20:48:01 -04:00
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-22 20:22:07 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-22 20:22:07 -04:00
}
fn compare_underline < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-22 20:22:07 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Underline < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-22 20:48:01 -04:00
2023-04-22 20:22:07 -04:00
Ok ( DiffResult {
2023-04-22 20:48:01 -04:00
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-22 20:22:07 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-22 20:22:07 -04:00
}
fn compare_verbatim < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-22 20:22:07 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Verbatim < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-22 20:48:01 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :value
2023-04-22 20:22:07 -04:00
Ok ( DiffResult {
2023-04-22 20:48:01 -04:00
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-22 20:22:07 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-22 20:22:07 -04:00
}
fn compare_code < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-22 20:22:07 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Code < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-22 20:48:01 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :value
2023-04-22 20:22:07 -04:00
Ok ( DiffResult {
2023-04-22 20:48:01 -04:00
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-22 20:22:07 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-22 20:22:07 -04:00
}
fn compare_strike_through < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-22 20:22:07 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s StrikeThrough < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-22 20:48:01 -04:00
2023-04-22 20:22:07 -04:00
Ok ( DiffResult {
2023-04-22 20:48:01 -04:00
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-22 17:58:16 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-22 17:58:16 -04:00
}
fn compare_regular_link < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-23 16:17:52 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s RegularLink < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-23 16:17:52 -04:00
2023-09-14 02:58:57 -04:00
// TODO: Compare :type :path :format :raw-link :application :search-option
2023-04-22 17:58:16 -04:00
Ok ( DiffResult {
2023-04-23 16:17:52 -04:00
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-22 17:58:16 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-22 17:58:16 -04:00
}
2023-04-24 18:55:15 -04:00
fn compare_radio_link < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-24 18:55:15 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s RadioLink < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-24 18:55:15 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :type :path :format :raw-link :application :search-option
2023-04-24 18:55:15 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-24 18:55:15 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-24 18:55:15 -04:00
}
fn compare_radio_target < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-04-24 18:55:15 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s RadioTarget < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-04-24 18:55:15 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :value
2023-04-24 18:55:15 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-04-24 18:55:15 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-04-24 18:55:15 -04:00
}
2023-07-13 18:18:07 -04:00
fn compare_plain_link < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-13 18:18:07 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s PlainLink < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-13 18:18:07 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :type :path :format :raw-link :application :search-option
2023-07-13 18:18:07 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-13 18:18:07 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-13 18:18:07 -04:00
}
2023-07-13 22:42:42 -04:00
fn compare_angle_link < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-13 22:42:42 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s AngleLink < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-13 22:42:42 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :type :path :format :raw-link :application :search-option
2023-07-13 22:42:42 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-13 22:42:42 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-13 22:42:42 -04:00
}
2023-07-13 23:26:51 -04:00
fn compare_org_macro < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-13 23:26:51 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s OrgMacro < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-13 23:26:51 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :key :value :args
2023-07-13 23:26:51 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-13 23:26:51 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-13 23:26:51 -04:00
}
2023-07-18 20:05:39 -04:00
fn compare_entity < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-18 20:05:39 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Entity < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-18 20:05:39 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :name :latex :latex-math-p :html :ascii :latin1 :utf-8 :use-brackets-p
2023-07-18 20:05:39 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-18 20:05:39 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-18 20:05:39 -04:00
}
2023-07-18 20:51:06 -04:00
fn compare_latex_fragment < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-18 20:51:06 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s LatexFragment < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-18 20:51:06 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :value
2023-07-18 20:51:06 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-18 20:51:06 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-18 20:51:06 -04:00
}
2023-07-19 00:09:16 -04:00
fn compare_export_snippet < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-19 00:09:16 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s ExportSnippet < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-19 00:09:16 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :back-end :value
2023-07-19 00:09:16 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-19 00:09:16 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-19 00:09:16 -04:00
}
2023-07-19 18:56:46 -04:00
fn compare_footnote_reference < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-19 18:56:46 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s FootnoteReference < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-19 18:56:46 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :label :type
2023-07-19 18:56:46 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-19 18:56:46 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-19 18:56:46 -04:00
}
2023-07-20 00:38:16 -04:00
fn compare_citation < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-20 00:38:16 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Citation < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-20 00:38:16 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :style :prefix :suffix
2023-07-20 00:38:16 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-20 00:38:16 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-20 00:38:16 -04:00
}
fn compare_citation_reference < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-20 00:38:16 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s CitationReference < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-20 00:38:16 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :key :prefix :suffix
2023-07-20 00:38:16 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-20 00:38:16 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-20 00:38:16 -04:00
}
2023-07-21 19:53:02 -04:00
fn compare_inline_babel_call < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-21 19:53:02 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s InlineBabelCall < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-21 19:53:02 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :call :inside-header :arguments :end-header :value
2023-07-21 19:53:02 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-21 19:53:02 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-21 19:53:02 -04:00
}
2023-07-21 22:29:04 -04:00
fn compare_inline_source_block < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-21 22:29:04 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s InlineSourceBlock < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-21 22:29:04 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :language :value :parameters
2023-07-21 22:29:04 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-21 22:29:04 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-21 22:29:04 -04:00
}
2023-07-21 23:48:37 -04:00
fn compare_line_break < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-21 23:48:37 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s LineBreak < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-21 23:48:37 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-21 23:48:37 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-21 23:48:37 -04:00
}
2023-07-22 01:15:04 -04:00
fn compare_target < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-22 01:15:04 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Target < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-22 01:15:04 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :value
2023-07-22 01:15:04 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-22 01:15:04 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-22 01:15:04 -04:00
}
2023-07-22 01:49:07 -04:00
fn compare_statistics_cookie < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-22 01:49:07 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s StatisticsCookie < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-22 01:49:07 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :value
2023-07-22 01:49:07 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-22 01:49:07 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-22 01:49:07 -04:00
}
2023-07-24 14:19:19 -04:00
fn compare_subscript < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-24 14:19:19 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Subscript < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-24 14:19:19 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :use-brackets-p
2023-09-21 14:30:56 -04:00
2023-07-24 14:19:19 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-24 14:19:19 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-24 14:19:19 -04:00
}
fn compare_superscript < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-24 14:19:19 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Superscript < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-24 14:19:19 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :use-brackets-p
2023-09-21 14:30:56 -04:00
2023-07-24 14:19:19 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-24 14:19:19 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-24 14:19:19 -04:00
}
2023-07-24 17:34:07 -04:00
fn compare_timestamp < ' s > (
2023-09-23 21:03:12 -04:00
_source : & ' s str ,
2023-07-24 17:34:07 -04:00
emacs : & ' s Token < ' s > ,
rust : & ' s Timestamp < ' s > ,
2023-08-29 22:47:40 -04:00
) -> Result < DiffEntry < ' s > , Box < dyn std ::error ::Error > > {
2023-09-23 21:03:12 -04:00
let this_status = DiffStatus ::Good ;
let message = None ;
2023-07-24 17:34:07 -04:00
2023-09-23 14:46:36 -04:00
// TODO: Compare :type :range-type :raw-value :year-start :month-start :day-start :hour-start :minute-start :year-end :month-end :day-end :hour-end :minute-end
2023-07-24 17:34:07 -04:00
Ok ( DiffResult {
status : this_status ,
2023-09-23 21:03:12 -04:00
name : rust . get_elisp_name ( ) ,
2023-08-29 21:05:51 -04:00
message ,
2023-07-24 17:34:07 -04:00
children : Vec ::new ( ) ,
2023-08-29 14:40:58 -04:00
rust_source : rust . get_source ( ) ,
emacs_token : emacs ,
2023-08-29 22:47:40 -04:00
}
. into ( ) )
2023-07-24 17:34:07 -04:00
}