1use serde::{Deserialize, Serialize};
16
17use crate::encoding::Encoding;
18use crate::span::Span;
19
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
22#[serde(rename_all = "snake_case")]
23#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
24pub enum Preview {
25 Laid(Laid),
26 Unsupported {
29 encoding: Encoding,
30 },
31}
32
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
36#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
37pub struct Laid {
38 pub span: Span,
39 pub blocks: Vec<Block>,
40}
41
42#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
44#[serde(rename_all = "snake_case")]
45#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
46pub enum ReplyState {
47 Streaming,
50 Settled,
53}
54
55#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
58#[serde(rename_all = "snake_case")]
59#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
60pub enum Block {
61 Heading {
63 span: Span,
64 level: u8,
65 inline: Vec<Inline>,
66 },
67 Paragraph {
68 span: Span,
69 inline: Vec<Inline>,
70 },
71 List {
72 span: Span,
73 order: Order,
74 spacing: Spacing,
75 items: Vec<ListItem>,
76 },
77 Quote {
78 span: Span,
79 blocks: Vec<Block>,
80 },
81 Code {
84 span: Span,
85 info: String,
86 text: String,
87 },
88 Table {
89 span: Span,
90 align: Vec<Align>,
91 head: Row,
92 body: Vec<Row>,
93 },
94 Rule {
96 span: Span,
97 },
98 Footnote {
100 span: Span,
101 name: String,
102 blocks: Vec<Block>,
103 },
104 Unsupported {
106 span: Span,
107 construct: Construct,
108 source: String,
109 },
110}
111
112#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
114#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
115pub struct ListItem {
116 pub span: Span,
117 pub check: Check,
118 pub blocks: Vec<Block>,
119}
120
121#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
123#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
124pub struct Row {
125 pub cells: Vec<Vec<Inline>>,
126}
127
128#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
131#[serde(rename_all = "snake_case")]
132#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
133pub enum Inline {
134 Text(String),
135 Code(String),
136 Emphasis(Vec<Inline>),
137 Strong(Vec<Inline>),
138 Strikethrough(Vec<Inline>),
139 Link {
142 target: String,
143 title: String,
144 content: Vec<Inline>,
145 },
146 Image {
148 target: String,
149 title: String,
150 alt: String,
151 },
152 FootnoteReference {
153 name: String,
154 },
155 SoftBreak,
156 LineBreak,
157 Unsupported {
159 construct: Construct,
160 source: String,
161 },
162}
163
164#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
166#[serde(rename_all = "snake_case")]
167#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
168pub enum Order {
169 Bullet,
170 Ordered { start: u64 },
171}
172
173#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
175#[serde(rename_all = "snake_case")]
176#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
177pub enum Spacing {
178 Tight,
179 Loose,
180}
181
182#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
184#[serde(rename_all = "snake_case")]
185#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
186pub enum Check {
187 NotATask,
188 Open,
189 Done,
190}
191
192#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
194#[serde(rename_all = "snake_case")]
195#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
196pub enum Align {
197 None,
198 Left,
199 Center,
200 Right,
201}
202
203#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
205#[serde(rename_all = "snake_case")]
206#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
207pub enum Construct {
208 Html,
210 Math,
212 FrontMatter,
214 Nesting,
216 Extension,
219}