Just barely starting to diff the two parsed forms.
This commit is contained in:
25
src/compare/diff.rs
Normal file
25
src/compare/diff.rs
Normal file
@@ -0,0 +1,25 @@
|
||||
use super::sexp::Token;
|
||||
use crate::parser::Document;
|
||||
|
||||
pub fn compare_document<'s>(
|
||||
emacs: &'s Token<'s>,
|
||||
rust: &'s Document<'s>,
|
||||
) -> Result<(), Box<dyn std::error::Error>> {
|
||||
compare_document_indented(0, emacs, rust)
|
||||
}
|
||||
|
||||
fn compare_document_indented<'s>(
|
||||
indentation: usize,
|
||||
emacs: &'s Token<'s>,
|
||||
rust: &'s Document<'s>,
|
||||
) -> Result<(), Box<dyn std::error::Error>> {
|
||||
let children = emacs.as_list()?;
|
||||
let first_child = children.first().ok_or("Should have at least one child")?;
|
||||
let first_child_text = first_child.as_atom()?;
|
||||
if first_child_text != "org-data" {
|
||||
return Err("Document should correspond to an org-data cell.".into());
|
||||
}
|
||||
// TODO: compare the children
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
mod diff;
|
||||
mod error;
|
||||
mod parse;
|
||||
mod sexp;
|
||||
pub use diff::compare_document;
|
||||
pub use parse::emacs_parse_org_document;
|
||||
pub use sexp::sexp;
|
||||
|
||||
@@ -30,6 +30,22 @@ pub struct TextWithProperties<'s> {
|
||||
properties: Vec<Token<'s>>,
|
||||
}
|
||||
|
||||
impl<'s> Token<'s> {
|
||||
pub fn as_list<'p>(&'p self) -> Result<&'p Vec<Token<'s>>, Box<dyn std::error::Error>> {
|
||||
Ok(match self {
|
||||
Token::List(children) => Ok(children),
|
||||
_ => Err("wrong token type"),
|
||||
}?)
|
||||
}
|
||||
|
||||
pub fn as_atom<'p>(&'p self) -> Result<&'s str, Box<dyn std::error::Error>> {
|
||||
Ok(match self {
|
||||
Token::Atom(body) => Ok(*body),
|
||||
_ => Err("wrong token type"),
|
||||
}?)
|
||||
}
|
||||
}
|
||||
|
||||
#[tracing::instrument(ret, level = "debug")]
|
||||
pub fn sexp<'s>(input: &'s str) -> Res<&'s str, Token<'s>> {
|
||||
let (remaining, _) = multispace0(input)?;
|
||||
|
||||
Reference in New Issue
Block a user