use super::TableCell;
use crate::validators::*;
use serde::Serialize;
use slack_messaging_derive::Builder;
#[derive(Debug, Clone, Serialize, PartialEq, Builder)]
#[serde(transparent)]
pub struct TableRow {
#[builder(push_item = "cell", validate("required", "list::max_item_20"))]
pub(crate) cells: Option<Vec<TableCell>>,
}
impl<Cell: Into<TableCell>> FromIterator<Cell> for TableRow {
fn from_iter<T: IntoIterator<Item = Cell>>(iter: T) -> Self {
Self {
cells: Some(iter.into_iter().map(|c| c.into()).collect()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::blocks::test_helpers::*;
use crate::errors::*;
#[test]
fn it_implements_builder() {
let expected = TableRow {
cells: Some(vec![
TableCell::RawText("foo".into()),
TableCell::RichText(rich_text()),
]),
};
let val = TableRow::builder()
.set_cells(Some(vec![
TableCell::RawText("foo".into()),
TableCell::RichText(rich_text()),
]))
.build()
.unwrap();
assert_eq!(val, expected);
let val = TableRow::builder()
.cells(vec![
TableCell::RawText("foo".into()),
TableCell::RichText(rich_text()),
])
.build()
.unwrap();
assert_eq!(val, expected);
}
#[test]
fn it_implements_push_item_method() {
let expected = TableRow {
cells: Some(vec![
TableCell::RawText("foo".into()),
TableCell::RichText(rich_text()),
]),
};
let val = TableRow::builder()
.cell("foo")
.cell(rich_text())
.build()
.unwrap();
assert_eq!(val, expected);
}
#[test]
fn it_requires_cells_field() {
let err = TableRow::builder().build().unwrap_err();
assert_eq!(err.object(), "TableRow");
let errors = err.field("cells");
assert!(errors.includes(ValidationErrorKind::Required));
}
#[test]
fn it_requires_cells_size_less_than_20() {
let cells: Vec<TableCell> = (0..21).map(|_| "foo".into()).collect();
let err = TableRow::builder().cells(cells).build().unwrap_err();
assert_eq!(err.object(), "TableRow");
let errors = err.field("cells");
assert!(errors.includes(ValidationErrorKind::MaxArraySize(20)));
}
}