approx_spans_usage/
approx_spans_usage.rs

1use rsonpath::{
2    engine::{Compiler, Engine, RsonpathEngine},
3    input::MmapInput,
4    result::MatchWriter,
5};
6use std::{env, error::Error, fs, io, process::ExitCode};
7
8fn main() -> Result<ExitCode, Box<dyn Error>> {
9    let args: Vec<_> = env::args().collect();
10
11    if args.len() != 3 {
12        eprintln!("provide exactly two arguments, query and file path");
13        return Ok(ExitCode::FAILURE);
14    }
15
16    let query_arg = &args[1];
17    let file_path = &args[2];
18
19    let query = rsonpath_syntax::parse(query_arg)?;
20    let file = fs::File::open(file_path)?;
21    // SAFETY: File is kept open until end of the run.
22    let input = unsafe { MmapInput::map_file(&file)? };
23    let stdout_lock = io::stdout().lock();
24    let mut sink = MatchWriter::from(stdout_lock);
25
26    let engine = RsonpathEngine::compile_query(&query)?;
27
28    engine.approximate_spans(&input, &mut sink)?;
29
30    Ok(ExitCode::SUCCESS)
31}