Just barely starting to diff the two parsed forms.

This commit is contained in:
Tom Alexander
2023-04-11 17:35:09 -04:00
parent 5305ae7627
commit 287cc8dea3
5 changed files with 54 additions and 2 deletions

25
src/compare/diff.rs Normal file
View 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(())
}

View File

@@ -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;

View File

@@ -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)?;