1use std::path::PathBuf;
2
3#[derive(Debug, serde::Deserialize, serde::Serialize)]
4pub struct Metadata {
5 pub name: String,
6 #[serde(default, skip_serializing_if = "Option::is_none")]
7 pub description: Option<String>,
8 #[serde(default, skip_serializing_if = "Option::is_none")]
9 pub attributes: Option<serde_json::Value>,
10}
11
12#[derive(Debug, serde::Deserialize, serde::Serialize)]
13pub struct MetadataWithTemplate<T = TemplateDefinition> {
14 #[serde(flatten)]
15 pub inner: Metadata,
16 pub template: T,
17}
18
19#[derive(Debug, serde::Deserialize, serde::Serialize)]
20pub struct LocalTemplateDefinition {
21 pub path: std::path::PathBuf,
22}
23
24impl Default for LocalTemplateDefinition {
25 fn default() -> Self {
26 Self {
27 path: PathBuf::from("template.mjml"),
28 }
29 }
30}
31
32#[derive(Debug, serde::Deserialize, serde::Serialize)]
33pub struct EmbeddedTemplateDefinition {
34 pub content: String,
35}
36
37#[derive(Debug, serde::Deserialize, serde::Serialize)]
38pub struct RemoteTemplateDefinition {
39 pub url: url::Url,
40}
41
42#[derive(Debug, serde::Deserialize, serde::Serialize)]
43#[serde(untagged)]
44pub enum TemplateDefinition {
45 Local(LocalTemplateDefinition),
46 Embedded(EmbeddedTemplateDefinition),
47 Remote(RemoteTemplateDefinition),
48}
49
50impl Default for TemplateDefinition {
51 fn default() -> Self {
52 Self::Local(LocalTemplateDefinition::default())
53 }
54}
55
56#[derive(Debug, serde::Deserialize, serde::Serialize)]
57#[serde(untagged)]
58pub enum Either<A, B> {
59 First(A),
60 Second(B),
61}