-
Notifications
You must be signed in to change notification settings - Fork 1
/
builder.gleam
133 lines (118 loc) · 4.16 KB
/
builder.gleam
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import gleam/string
import gleam/string_builder
import gleam/bool
import gleam/list
pub type XmlError {
ContentsEmpty
TagNameEmpty
OptionsEmpty
VersionEmpty
EncodingEmpty
}
pub type Option {
Opt(label: String, value: String)
}
///This is a basic tag, ie. name and the contents
/// Ex. builder.basic_tag("pubDate", "12 Mar 2024") to
/// <pubDate> 12 Mar 2024 <pubDate> \n
/// basic_tag(tag_name, contents)
@deprecated("Please Migrate to xml_builder module")
pub fn basic_tag(
tag_name: String,
contents: List(String),
) -> Result(String, XmlError) {
//Input pubDate, ____date -> <pubDate>_____date</pubDate>
let tag_name_empty = string.is_empty(tag_name)
use <- bool.guard(when: tag_name_empty, return: Error(TagNameEmpty))
let contents_empty = list.is_empty(contents)
use <- bool.guard(when: contents_empty, return: Error(ContentsEmpty))
let string_contents = string.concat(contents)
string_builder.new()
|> string_builder.append("<")
|> string_builder.append(tag_name)
|> string_builder.append("> ")
|> string_builder.append(string_contents)
|> string_builder.append(" </")
|> string_builder.append(tag_name)
|> string_builder.append("> \n")
|> string_builder.to_string()
|> Ok
}
///This is a tag with options and content
/// Ex. opts_cont_tag("enclosure", [opts("url", "https://example.com")],
/// "IDK why you would use this")
/// ->
/// <enclosure url="https://example.com"> IDK why you would use this </enclosure>
@deprecated("Please Migrate to xml_builder module")
pub fn option_content_tag(
tag_name: String,
options: List(Option),
contents: List(String),
) -> Result(String, XmlError) {
let tag_name_empty = string.is_empty(tag_name)
use <- bool.guard(when: tag_name_empty, return: Error(TagNameEmpty))
let contents_empty = list.is_empty(contents)
use <- bool.guard(when: contents_empty, return: Error(ContentsEmpty))
let options_empty = list.is_empty(options)
use <- bool.guard(when: options_empty, return: Error(OptionsEmpty))
let string_contents = string.concat(contents)
string_builder.new()
|> string_builder.append("<")
|> string_builder.append(tag_name)
|> string_builder.append(string_options(options))
|> string_builder.append("> \n ")
|> string_builder.append(string_contents)
|> string_builder.append(" </")
|> string_builder.append(tag_name)
|> string_builder.append("> \n")
|> string_builder.to_string
|> Ok
}
@deprecated("Please Migrate to xml_builder module")
pub fn option_tag(
tag_name: String,
options: List(Option),
) -> Result(String, XmlError) {
let tag_name_empty = string.is_empty(tag_name)
use <- bool.guard(when: tag_name_empty, return: Error(TagNameEmpty))
let contents_empty = list.is_empty(options)
use <- bool.guard(when: contents_empty, return: Error(ContentsEmpty))
string_builder.new()
|> string_builder.append("<")
|> string_builder.append(tag_name)
|> string_builder.append(string_options(options))
|> string_builder.append(" /> \n")
|> string_builder.to_string()
|> Ok()
}
///This is the header tag REQUIRED by all valid XML documents
/// Usage: xml(version (1.0), encoding (UTF-8),
/// document: List(String) -> [basic_tag(...), basic_tag(...)])
@deprecated("Please Migrate to xml_builder module")
pub fn xml(
version: String,
encoding: String,
document_parts: List(String),
) -> Result(String, XmlError) {
let version_empty = string.is_empty(version)
use <- bool.guard(when: version_empty, return: Error(VersionEmpty))
let encoding_empty = string.is_empty(encoding)
use <- bool.guard(when: encoding_empty, return: Error(EncodingEmpty))
let document = string.concat(document_parts)
string_builder.new()
|> string_builder.append("<?xml version=\"")
|> string_builder.append(version)
|> string_builder.append("\" encoding=\"")
|> string_builder.append(encoding)
|> string_builder.append("\"?> \n")
|> string_builder.append(document)
|> string_builder.to_string
|> Ok
}
fn string_options(options: List(Option)) -> String {
let str_option_list = list.map(options, option_to_string)
list.fold(str_option_list, "", string.append)
}
fn option_to_string(option: Option) -> String {
string.concat([" ", option.label, "=\"", option.value, "\""])
}