]> git.scottworley.com Git - tablify/blobdiff - src/lib.rs
Don't allocate columns to rare events
[tablify] / src / lib.rs
index bad71d0b2c2116d9134495c08f8316b84ffd4a7b..a7c28198b5faa15056fd274f1b9bd85ea61dd1dc 100644 (file)
@@ -4,7 +4,9 @@ use std::fmt::Write;
 use std::io::BufRead;
 use std::iter::Iterator;
 
 use std::io::BufRead;
 use std::iter::Iterator;
 
-pub struct Config {}
+pub struct Config {
+    pub column_threshold: usize,
+}
 
 const HEADER: &str = r#"<!DOCTYPE html>
 <html>
 
 const HEADER: &str = r#"<!DOCTYPE html>
 <html>
@@ -180,10 +182,10 @@ fn column_counts(rows: &[Row]) -> Vec<(usize, String)> {
     counts.sort_unstable_by(|(an, acol), (bn, bcol)| bn.cmp(an).then(acol.cmp(bcol)));
     counts
 }
     counts.sort_unstable_by(|(an, acol), (bn, bcol)| bn.cmp(an).then(acol.cmp(bcol)));
     counts
 }
-fn column_order(rows: &[Row]) -> Vec<String> {
+fn column_order(config: &Config, rows: &[Row]) -> Vec<String> {
     column_counts(rows)
         .into_iter()
     column_counts(rows)
         .into_iter()
-        .map(|(_, col)| col)
+        .filter_map(|(n, col)| (n >= config.column_threshold).then_some(col))
         .collect()
 }
 
         .collect()
 }
 
@@ -286,7 +288,7 @@ fn render_column_headers(columns: &[String]) -> HTML {
 ///     * an indented line with no preceding non-indented line
 pub fn tablify(config: &Config, input: impl std::io::Read) -> Result<HTML, std::io::Error> {
     let rows = read_rows(input).collect::<Result<Vec<_>, _>>()?;
 ///     * an indented line with no preceding non-indented line
 pub fn tablify(config: &Config, input: impl std::io::Read) -> Result<HTML, std::io::Error> {
     let rows = read_rows(input).collect::<Result<Vec<_>, _>>()?;
-    let columns = column_order(&rows);
+    let columns = column_order(config, &rows);
     Ok(HTML(format!(
         "{HEADER}{}{}{FOOTER}",
         render_column_headers(&columns),
     Ok(HTML(format!(
         "{HEADER}{}{}{FOOTER}",
         render_column_headers(&columns),