In my project I want to analyze the source code of a PHP file and convert it to AST. There is already a javascript package for this, but it only works with node. So I tried to convert the PHP code to AST using a Rust library. However, I have no experience with Rust and do not get anywhere:
inside file src-tauri/src/main.rs:
#[tauri::command]
fn php_to_ast(code: &str) -> String {
match parser::parse(code) {
Ok(ast) => {
format!("{:?}", ast)
}
}
}
invoke in typescript:
invoke('php_to_ast', { code: value }).then((result) => {
this._ast = result;
console.log({ast: this._ast});
}).catch((error) => {
console.error({error});
});
the console error message is:
error[E0004]: non-exhaustive patterns: `Err(_)` not covered
--> src/main.rs:8:11
|
8 | match parser::parse(code) {
| ^^^^^^^^^^^^^^^^^^^ pattern `Err(_)` not covered
|
note: `Result<Vec<php_parser_rs::parser::ast::Statement>, ParseErrorStack>` defined here
= note: the matched value is of type `Result<Vec<php_parser_rs::parser::ast::Statement>, ParseErrorStack>`
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
|
11~ }
12+ Err(_) => todo!()
|
I am aware that I am not fully processing the return values from parser::parse()
. For comparison, in the Rust library example, the call looks like this:
fn main() -> Result<()> {
match parser::parse(CODE) {
Ok(ast) => {
println!("{:#?}", ast);
}
Err(err) => {
println!("{}", err.report(CODE, None, true, false)?);
println!("parsed so far: {:#?}", err.partial);
}
}
Ok(())
}
Presumably I should also still process and return the errors (as a string with an error message?).