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