use crate::compose::Environment; use crate::poem::Verse; use crate::poem::{read::Readable, recite::Reciteable, Poem}; use std::fs; /// source /// /// The builtin `source` command. Used to change the shell's global environment /// state via a `.sh` or `.dwvsh` file. /// /// # Shell Examples /// ```sh /// source ~/.dwvshrc /// ``` pub fn incant(verse: &Verse, out: &mut String, env: &mut Environment) -> i32 { let files = match verse.clause() { Some(clause) => clause, None => { eprintln!("source: not enough arguments"); return 1; } }; for file in files { let poetry = match fs::read_to_string(&file) { Ok(poetry) => poetry, Err(e) => { eprintln!( "source: could not load {}: {}", file, e.to_string().to_lowercase() ); return 127; } }; let poem = match Poem::read(poetry, env) { Ok(poem) => poem, Err(e) => { eprintln!("dwvsh: {}", e.to_string().to_lowercase()); continue; } }; let stdout = if verse.couplet { Some(true) } else { None }; *out = match poem.recite(env, stdout) { Ok(out) => out, Err(e) => { eprintln!("dwvsh: {}", e.to_string().to_lowercase()); continue; } }; } 0 }