nib/
loader.rs

1//!
2use crate::metadata::{EntryKey as Key, Entry, KEY_PREFIX, KEY_SUFFIX, Metadata};
3use crate::renderer::render;
4
5/// read entry metadata at the beginnig of each file and its content.
6pub fn load_data(s: &str) -> Entry {
7    let mut v = Entry::default();
8
9    v.add(Key::Date, "".to_string());
10    v.add(Key::Description, "".to_string());
11    v.add(Key::Lang, "en".to_string());
12    v.add(Key::Title, "".to_string());
13
14    let mut iter = s.lines();
15    loop {
16        match iter.next() {
17            Some(a) if a.starts_with(KEY_PREFIX) => {
18                let p: Vec<&str> = a.splitn(2, KEY_SUFFIX).collect();
19                if p.len() == 2 {
20                    let key_value = p[0].replace(KEY_PREFIX, "");
21                    let key = Key::from(&key_value);
22                    if key == Key::Unknown {
23                        eprintln!("Unknown key: {}", &key_value);
24                    } else {
25                        v.add(key, p[1].trim_start().to_owned());
26                    }
27                }
28            }
29            _ => break,
30        }
31    }
32
33    let body: Vec<&str> = iter.collect();
34    if let Ok(c) = render(&format!("{}\n", body.join("\n"))) {
35        v.add(Key::from(&("content".to_string())), c);
36    }
37    v
38}