
By placing the code for the parse executable inside a module inside the organic library, we only need to expose the entrypoint publicly rather than all functions it calls. This hides the event_count module, but I will be expanding the practice to the rest of the code base shortly. This is important for not inadvertently promising stability w.r.t. semver for essentially internal functions for development tools. It was the parse binary, not compare.
60 lines
1.9 KiB
Rust
60 lines
1.9 KiB
Rust
use std::io::Read;
|
|
use std::path::Path;
|
|
|
|
use crate::parser::parse;
|
|
use crate::parser::parse_with_settings;
|
|
use crate::settings::GlobalSettings;
|
|
use crate::settings::LocalFileAccessInterface;
|
|
|
|
#[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))]
|
|
pub fn main_body() -> Result<(), Box<dyn std::error::Error>> {
|
|
let args = std::env::args().skip(1);
|
|
if args.is_empty() {
|
|
let org_contents = read_stdin_to_string()?;
|
|
run_anonymous_parse(org_contents)
|
|
} else {
|
|
for arg in args {
|
|
run_parse_on_file(arg)?
|
|
}
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
fn read_stdin_to_string() -> Result<String, Box<dyn std::error::Error>> {
|
|
let mut stdin_contents = String::new();
|
|
std::io::stdin()
|
|
.lock()
|
|
.read_to_string(&mut stdin_contents)?;
|
|
Ok(stdin_contents)
|
|
}
|
|
|
|
fn run_anonymous_parse<P: AsRef<str>>(org_contents: P) -> Result<(), Box<dyn std::error::Error>> {
|
|
let org_contents = org_contents.as_ref();
|
|
let rust_parsed = parse(org_contents)?;
|
|
println!("{:#?}", rust_parsed);
|
|
#[cfg(feature = "event_count")]
|
|
crate::event_count::report(org_contents);
|
|
Ok(())
|
|
}
|
|
|
|
fn run_parse_on_file<P: AsRef<Path>>(org_path: P) -> Result<(), Box<dyn std::error::Error>> {
|
|
let org_path = org_path.as_ref();
|
|
let parent_directory = org_path
|
|
.parent()
|
|
.ok_or("Should be contained inside a directory.")?;
|
|
let org_contents = std::fs::read_to_string(org_path)?;
|
|
let org_contents = org_contents.as_str();
|
|
let file_access_interface = LocalFileAccessInterface {
|
|
working_directory: Some(parent_directory.to_path_buf()),
|
|
};
|
|
let global_settings = GlobalSettings {
|
|
file_access: &file_access_interface,
|
|
..Default::default()
|
|
};
|
|
let rust_parsed = parse_with_settings(org_contents, &global_settings)?;
|
|
println!("{:#?}", rust_parsed);
|
|
#[cfg(feature = "event_count")]
|
|
crate::event_count::report(org_contents);
|
|
Ok(())
|
|
}
|