cder/
lib.rs

1mod database_seeder;
2mod reader;
3mod resolver;
4mod struct_loader;
5pub use database_seeder::DatabaseSeeder;
6pub use struct_loader::StructLoader;
7
8use anyhow::Result;
9use reader::read_file;
10use resolver::resolve_tags;
11use serde::de::DeserializeOwned;
12use std::collections::HashMap;
13
14pub type Dict<T> = HashMap<String, T>;
15
16fn load_named_records<T>(
17    filename: &str,
18    base_dir: &str,
19    dependencies: &Dict<String>,
20) -> Result<Dict<T>>
21where
22    T: DeserializeOwned,
23{
24    // read contents as string from the seed file
25    let raw_text = read_file(filename, base_dir)?;
26
27    // replace embedded tags before deserialization gets started
28    let parsed_text = resolve_tags(&raw_text, dependencies).map_err(|err| {
29        anyhow::anyhow!(
30            "failed to pre-process embedded tags: {}\n   err: {}",
31            filename,
32            err
33        )
34    })?;
35
36    // deserialization
37    // currently accepts yaml format only, but this could accept any other serde-compatible format, e.g. json
38    let records = serde_yaml::from_str(&parsed_text).map_err(|err| {
39        anyhow::anyhow!(
40            "deserialization failed. check the file: {}
41            err: {}",
42            filename,
43            err
44        )
45    })?;
46
47    Ok(records)
48}