1use anyhow::{Context, Result};
2use crop::Rope;
3
4mod collect;
5mod format;
6mod line_length;
7mod print;
8mod unparse;
9mod vendor;
10
11#[cfg(test)]
12mod testing;
13
14use vendor::ast;
15
16pub use format::FormatOptions;
17
18pub fn try_fmt_file(source: &str, options: &format::FormatOptions) -> Result<String> {
19 let (processed_source, ignore_info) = format::preprocess_source_for_ignore(source);
20
21 let ast = syn::parse_file(&processed_source).context("Failed to parse source")?;
22 let rope = Rope::from(processed_source);
23 let (mut rope, macros) = collect::collect_macros_from_file(&ast, rope, &options.macro_names);
24 let formatted_processed = format::format_source(&mut rope, macros, options);
25
26 if ignore_info.is_empty() {
28 Ok(formatted_processed)
29 } else {
30 Ok(format::reinsert_ignored_lines_in_source(
31 &formatted_processed,
32 &ignore_info,
33 ))
34 }
35}