diff options
Diffstat (limited to 'src/template.rs')
-rw-r--r-- | src/template.rs | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/src/template.rs b/src/template.rs index f3985e2..0ac67fb 100644 --- a/src/template.rs +++ b/src/template.rs @@ -247,27 +247,43 @@ mod table { use super::*; #[derive(Debug, Serialize, Deserialize, Clone)] + pub struct TableRow { + pub index: i32, + pub columns: Vec<Json>, + } + + #[derive(Debug, Serialize, Deserialize, Clone)] pub struct DisplayTable { - pub headings: Vec<String>, - pub rows: Vec<Vec<Json>>, + pub num_rows: usize, + pub num_columns: usize, + pub headings: TableRow, + pub rows: Vec<TableRow>, } pub fn apply(columns: &Vec<Column>, d: &Json) -> Result<DisplayTable, Error> { let rows = d .as_array() - .ok_or_else(|| Error::TemplateError("expected array".to_string(), d.clone()))?; + .ok_or_else(|| Error::TemplateError("expected array".to_string(), d.clone()))? + .iter() + .map(|d| { + columns + .iter() + .map(|c| function::eval(&c.field, d)) + .collect::<Result<Vec<_>, _>>() + }) + .collect::<Result<Vec<_>, _>>()?; Ok(DisplayTable { - headings: columns.iter().map(|c| c.display_name.clone()).collect(), - rows: rows - .iter() - .map(|d| { - columns - .iter() - .map(|c| function::eval(&c.field, d)) - .collect::<Result<Vec<_>, _>>() - }) - .collect::<Result<Vec<_>, _>>()?, + num_rows: rows.len(), + num_columns: columns.len(), + headings: TableRow { + index: 1, + columns: columns.iter().map(|c| json!(c.display_name)).collect(), + }, + rows: (2..).zip(rows.into_iter()).map(|(i, columns)| TableRow { + index: i, + columns: columns, + }).collect(), }) } } |