use serde::Serialize;
pub mod builders;
pub mod elements;
pub mod rich_text;
pub mod table;
pub mod data_visualization;
pub mod data_table;
mod actions;
mod alert;
mod card;
mod carousel;
mod context;
mod context_actions;
mod divider;
mod file;
mod header;
mod image;
mod input;
mod markdown;
mod plan;
mod section;
mod task_card;
mod video;
pub use actions::{Actions, ActionsElement};
pub use alert::{Alert, AlertLevel};
pub use card::Card;
pub use carousel::Carousel;
pub use context::{Context, ContextElement};
pub use context_actions::{ContextActions, ContextActionsElement};
pub use data_table::DataTable;
pub use data_visualization::DataVisualization;
pub use divider::Divider;
pub use file::{File, FileSource};
pub use header::Header;
pub use image::Image;
pub use input::{Input, InputElement};
pub use markdown::Markdown;
pub use plan::Plan;
pub use rich_text::RichText;
pub use section::{Accessory, Section};
pub use table::Table;
pub use task_card::{TaskCard, TaskStatus};
pub use video::Video;
#[derive(Debug, Clone, Serialize, PartialEq)]
#[serde(untagged)]
pub enum Block {
Actions(Box<Actions>),
Alert(Box<Alert>),
Card(Box<Card>),
Carousel(Box<Carousel>),
Context(Box<Context>),
ContextActions(Box<ContextActions>),
DataTable(Box<DataTable>),
DataVisualization(Box<DataVisualization>),
Divider(Box<Divider>),
File(Box<File>),
Header(Box<Header>),
Image(Box<Image>),
Input(Box<Input>),
Markdown(Box<Markdown>),
Plan(Box<Plan>),
RichText(Box<RichText>),
Section(Box<Section>),
Table(Box<Table>),
TaskCard(Box<TaskCard>),
Video(Box<Video>),
}
macro_rules! block_from {
($($ty:ident,)*) => {
$(
impl From<$ty> for Block {
fn from(value: $ty) -> Self {
Self::$ty(Box::new(value))
}
}
)*
}
}
block_from! {
Actions,
Alert,
Card,
Carousel,
Context,
ContextActions,
DataTable,
DataVisualization,
Divider,
File,
Header,
Image,
Input,
Markdown,
Plan,
RichText,
Section,
Table,
TaskCard,
Video,
}
#[cfg(test)]
pub mod test_helpers {
use super::rich_text::test_helpers as rich_text_helper;
use super::rich_text::types::test_helpers::*;
use super::*;
use crate::composition_objects::test_helpers::*;
pub fn header(text: impl Into<String>) -> Header {
Header {
block_id: None,
text: Some(plain_text(text)),
}
}
pub fn section(text: impl Into<String>) -> Section {
Section {
block_id: None,
text: Some(mrkdwn_text(text).into()),
fields: None,
accessory: None,
expand: None,
}
}
pub fn rich_text() -> RichText {
RichText {
block_id: Some("rich_text_0".into()),
elements: Some(vec![rich_text_helper::section(vec![el_text("foo")]).into()]),
}
}
pub fn task_card() -> TaskCard {
TaskCard {
task_id: Some("task_0".into()),
title: Some("Fetching weather data".into()),
status: Some(TaskStatus::Pending),
output: None,
details: None,
sources: None,
block_id: None,
}
}
}