X-Git-Url: http://git.scottworley.com/tablify/blobdiff_plain/3135b2cd109024a66320267f3e83592cb75f1d69..a638dfe78611c069402096f0c702c3f51648962c:/src/lib.rs diff --git a/src/lib.rs b/src/lib.rs index 2111e1e..b4b8bbc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -359,31 +359,34 @@ fn render_row(config: &Config, columns: &[String], rowlike: &mut Rowlike) -> HTM } } -fn render_column_headers(config: &Config, columns: &[String]) -> HTML { +fn column_header_order<'a>( + config: &'a Config, + columns: &'a [String], +) -> impl Iterator> { let static_columns = config.static_columns.iter().map(|oc| oc.as_ref()); let dynamic_columns = columns.iter().map(Some); + static_columns.chain(dynamic_columns).filter(|ocol| { + ocol.map_or(true, |col| !config.hidden_columns.contains(col)) + }) +} + +fn render_column_headers(config: &Config, columns: &[String]) -> HTML { HTML( String::from(r#""#) - + &static_columns - .chain(dynamic_columns) - .filter(|ocol| { - ocol.map(|col| !config.hidden_columns.contains(col)) - .unwrap_or(true) - }) - .fold(String::new(), |mut acc, ocol| { - match ocol { - Some(col) => { - let col_header = HTML::escape(col); - write!( - &mut acc, - r#"
{col_header}
"# - ) - } - None => write!(&mut acc, r#""#), + + &column_header_order(config, columns).fold(String::new(), |mut acc, ocol| { + match ocol { + Some(col) => { + let col_header = HTML::escape(col); + write!( + &mut acc, + r#"
{col_header}
"# + ) } - .unwrap(); - acc - }) + None => write!(&mut acc, r#""#), + } + .unwrap(); + acc + }) + "\n", ) } @@ -592,6 +595,30 @@ mod tests { ); } + #[test] + fn test_column_header_order() { + let mut cfg = Config::default(); + + assert!(column_header_order(&cfg, &["foo".to_owned()]).eq([Some(&"foo".to_owned())])); + + cfg.static_columns.push(Some("bar".to_owned())); + assert!(column_header_order(&cfg, &["foo".to_owned()]) + .eq([Some(&"bar".to_owned()), Some(&"foo".to_owned())])); + + cfg.static_columns.push(None); + assert!(column_header_order(&cfg, &["foo".to_owned()]).eq([ + Some(&"bar".to_owned()), + None, + Some(&"foo".to_owned()) + ])); + + cfg.hidden_columns.insert("foo".to_owned()); + assert!(column_header_order(&cfg, &["foo".to_owned()]).eq([Some(&"bar".to_owned()), None])); + + cfg.hidden_columns.insert("bar".to_owned()); + assert!(column_header_order(&cfg, &["foo".to_owned()]).eq([None])); + } + #[test] fn test_render_cell() { assert_eq!(