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
134
135
136
137
138
139
140
141
142
use crate::file::SectionBody;
use crate::parser::{parse_from_bytes, parse_from_str, Error, Event, Parser};
use crate::File;
use std::convert::TryFrom;
use std::fmt::Display;
impl<'a> TryFrom<&'a str> for File<'a> {
type Error = Error<'a>;
fn try_from(s: &'a str) -> Result<File<'a>, Self::Error> {
parse_from_str(s).map(Self::from)
}
}
impl<'a> TryFrom<&'a [u8]> for File<'a> {
type Error = Error<'a>;
fn try_from(value: &'a [u8]) -> Result<File<'a>, Self::Error> {
parse_from_bytes(value).map(File::from)
}
}
impl<'a> TryFrom<&'a Vec<u8>> for File<'a> {
type Error = Error<'a>;
fn try_from(value: &'a Vec<u8>) -> Result<File<'a>, Self::Error> {
parse_from_bytes(value).map(File::from)
}
}
impl<'a> From<Parser<'a>> for File<'a> {
fn from(parser: Parser<'a>) -> Self {
let mut new_self = Self::default();
let mut prev_section_header = None;
let mut section_events = SectionBody::new();
#[allow(clippy::explicit_into_iter_loop)]
for event in parser.into_iter() {
match event {
Event::SectionHeader(header) => {
if let Some(prev_header) = prev_section_header.take() {
new_self.push_section_internal(prev_header, section_events);
} else {
new_self.frontmatter_events = section_events;
}
prev_section_header = Some(header);
section_events = SectionBody::new();
}
e @ Event::Key(_)
| e @ Event::Value(_)
| e @ Event::ValueNotDone(_)
| e @ Event::ValueDone(_)
| e @ Event::KeyValueSeparator => section_events.as_mut().push(e),
e @ Event::Comment(_) | e @ Event::Newline(_) | e @ Event::Whitespace(_) => {
section_events.as_mut().push(e);
}
}
}
if let Some(header) = prev_section_header {
new_self.push_section_internal(header, section_events);
} else {
new_self.frontmatter_events = section_events;
}
new_self
}
}
impl From<File<'_>> for Vec<u8> {
fn from(c: File<'_>) -> Self {
c.into()
}
}
impl From<&File<'_>> for Vec<u8> {
fn from(config: &File<'_>) -> Self {
let mut value = Self::new();
for events in config.frontmatter_events.as_ref() {
value.extend(events.to_vec());
}
for section_id in &config.section_order {
value.extend(
config
.section_headers
.get(section_id)
.expect("section_header does not contain section id from section_order")
.to_vec(),
);
for event in config
.sections
.get(section_id)
.expect("sections does not contain section id from section_order")
.as_ref()
{
value.extend(event.to_vec());
}
}
value
}
}
impl Display for File<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
for front_matter in self.frontmatter_events.as_ref() {
front_matter.fmt(f)?;
}
for section_id in &self.section_order {
self.section_headers.get(section_id).unwrap().fmt(f)?;
for event in self.sections.get(section_id).unwrap().as_ref() {
event.fmt(f)?;
}
}
Ok(())
}
}