}
}
-fn render_column_headers(config: &Config, columns: &[String]) -> HTML {
+fn column_header_order<'a>(
+ config: &'a Config,
+ columns: &'a [String],
+) -> impl Iterator<Item = Option<&'a String>> {
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#"<tr class="key"><th></th>"#)
- + &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#"<th id="{col_header}"><div><div>{col_header}</div></div></th>"#
- )
- }
- None => write!(&mut acc, r#"<th class="col_spacer"></th>"#),
+ + &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#"<th id="{col_header}"><div><div>{col_header}</div></div></th>"#
+ )
}
- .unwrap();
- acc
- })
+ None => write!(&mut acc, r#"<th class="col_spacer"></th>"#),
+ }
+ .unwrap();
+ acc
+ })
+ "</tr>\n",
)
}