1use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Default, Deserialize, Serialize)]
6#[serde(default, rename_all = "camelCase")]
7pub struct Presentation {
8 pub presentation_id: String,
10 pub title: Option<String>,
12 pub revision_id: Option<String>,
14 pub page_size: Option<serde_json::Value>,
16 pub slides: Vec<Page>,
18 pub layouts: Vec<Page>,
20 pub masters: Vec<Page>,
22}
23
24#[derive(Debug, Clone, Default, Deserialize, Serialize)]
26#[serde(default, rename_all = "camelCase")]
27pub struct Page {
28 pub object_id: String,
30 pub page_type: Option<String>,
32 pub page_elements: Vec<PageElement>,
34 pub slide_properties: Option<SlideProperties>,
36}
37
38#[derive(Debug, Clone, Default, Deserialize, Serialize)]
40#[serde(default, rename_all = "camelCase")]
41pub struct SlideProperties {
42 pub notes_page: Option<Box<Page>>,
44}
45
46#[derive(Debug, Clone, Default, Deserialize, Serialize)]
48#[serde(default, rename_all = "camelCase")]
49pub struct PageElement {
50 pub object_id: String,
52 pub shape: Option<Shape>,
54 pub table: Option<Table>,
56 pub image: Option<serde_json::Value>,
58 pub element_group: Option<ElementGroup>,
60}
61
62#[derive(Debug, Clone, Default, Deserialize, Serialize)]
64#[serde(default)]
65pub struct ElementGroup {
66 pub children: Vec<PageElement>,
68}
69
70#[derive(Debug, Clone, Default, Deserialize, Serialize)]
72#[serde(default)]
73pub struct Shape {
74 pub text: Option<Text>,
76}
77
78#[derive(Debug, Clone, Default, Deserialize, Serialize)]
80#[serde(default, rename_all = "camelCase")]
81pub struct Text {
82 pub text_elements: Vec<TextElement>,
84}
85impl Text {
86 pub fn content(&self) -> String {
88 self.text_elements
89 .iter()
90 .filter_map(|e| e.text_run.as_ref())
91 .map(|r| r.content.as_str())
92 .collect()
93 }
94}
95
96#[derive(Debug, Clone, Default, Deserialize, Serialize)]
98#[serde(default, rename_all = "camelCase")]
99pub struct TextElement {
100 pub text_run: Option<TextRun>,
102}
103
104#[derive(Debug, Clone, Default, Deserialize, Serialize)]
106#[serde(default)]
107pub struct TextRun {
108 pub content: String,
110}
111
112#[derive(Debug, Clone, Default, Deserialize, Serialize)]
114#[serde(default, rename_all = "camelCase")]
115pub struct Table {
116 pub table_rows: Vec<TableRow>,
118}
119
120#[derive(Debug, Clone, Default, Deserialize, Serialize)]
122#[serde(default, rename_all = "camelCase")]
123pub struct TableRow {
124 pub table_cells: Vec<TableCell>,
126}
127
128#[derive(Debug, Clone, Default, Deserialize, Serialize)]
130#[serde(default, rename_all = "camelCase")]
131pub struct TableCell {
132 pub text: Option<Text>,
134 pub location: Option<CellLocation>,
136}
137
138#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, Eq)]
140#[serde(default, rename_all = "camelCase")]
141pub struct CellLocation {
142 pub row_index: usize,
144 pub column_index: usize,
146}