1use std::{fs::read_to_string, sync::Arc};
2
3use color_eyre::eyre::Context;
4use glob::glob;
5use nailbox::try_arc_within;
6use nailconfig::NailConfig;
7use nailgen::{GeneratedTemplate, MarkovGen, WarningTemplate};
8use nailstate::Templates;
9
10/// Takes a glob for finding all input files and returns a read-only list of
11/// all markov chains that can be generated.
12pub fn get_input_files(config: &NailConfig) -> color_eyre::Result<Arc<[MarkovGen]>> {
13 let inputs = glob(&config.generator.input_files)?
14 .filter_map(|path| {
15 path.inspect_err(|err| tracing::error!("IO Error: {err}"))
16 .ok()
17 })
18 .filter_map(|input| {
19 MarkovGen::new(input)
20 .inspect_err(|err| tracing::error!("Markov Error: {err}"))
21 .ok()
22 })
23 .collect::<Arc<[MarkovGen]>>();
24
25 if inputs.is_empty() {
26 color_eyre::eyre::bail!("No input files found! Exiting...");
27 }
28
29 Ok(inputs)
30}
31
32pub fn get_template_files(config: &NailConfig) -> color_eyre::Result<Arc<Templates>> {
33 let (index, content) = (
34 read_to_string(&config.generator.warning_template).context("Missing Warning Template")?,
35 read_to_string(&config.generator.warning_message).context("Missing Warning Message")?,
36 );
37 let generated = read_to_string(&config.generator.generated_template)
38 .context("Missing Generated Template")?;
39
40 let templates = try_arc_within(|| -> color_eyre::Result<Templates> {
41 Ok(Templates {
42 warning: WarningTemplate::init(index.into(), content.into()).context(
43 "Warning Template should only contain title, main and footer placeholders"
44 )?,
45 generated: GeneratedTemplate::init(generated.into()).context("Generated template contains invalid placeholders, should only contain title, initial, main, extra and footer placeholders")?,
46 })
47 })?;
48
49 Ok(templates)
50}