A pit full of rusty nails
at 58a5a53da409bdb8959f4b6dbee2ff56fcb251b1 57 lines 2.2 kB view raw
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}