mod block;
mod diagnostic;
mod parse;
mod resolve;
mod session;
pub mod source;
mod span;
use color_eyre::eyre::Result;
use self::block::Block;
use self::parse::Parser;
use self::resolve::Resolver;
use self::source::Source;
use crate::profile::variables::Vars;
#[derive(Debug, Clone)]
pub struct Template<'a> {
source: Source<'a>,
blocks: Vec<Block>,
}
impl<'a> Template<'a> {
pub fn parse(source: Source<'a>) -> Result<Self> {
Parser::new(source).parse()
}
pub fn resolve<PV: Vars, DV: Vars>(
&self,
profile_vars: Option<&PV>,
dotfile_vars: Option<&DV>,
) -> Result<String> {
Resolver::new(self, profile_vars, dotfile_vars).resolve()
}
}
#[cfg(test)]
mod tests {
use std::collections::HashMap;
use super::*;
use crate::profile::variables::Variables;
#[test]
fn parse_template() -> Result<()> {
crate::tests::setup_test_env();
let content = r#"
[some settings]
var = 2
foo = "bar"
fizz = {{BUZZ}}
escaped = {{{42}}}
{{!--
Sets the message of the day for a specific operating system
If no os matches it defaults to a generic one.
--}}
{{@print Writing motd...}}
{{@if {{&OS}} == "linux" }}
{{@print Linux Motd!}}
[linux]
motd = "very nice"
{{@elif {{&#OS}} == "windows" }}
[windows]
motd = "nice"
{{@else}}
[other]
motd = "who knows"
{{@fi}}
{{!-- Check if not windows --}}
{{@if {{&OS}} != "windows"}}
windows = false
{{@fi}}
[last]
num = 23
threads = 1337
os_str = "_unkown"
"#;
let source = Source::anonymous(content);
let template = Template::parse(source)?;
let mut vars = HashMap::new();
vars.insert(String::from("BUZZ"), String::from("Hello World"));
vars.insert(String::from("OS"), String::from("linux"));
let vars = Variables { inner: vars };
println!("{}", template.resolve(Some(&vars), Some(&vars))?);
Ok(())
}
#[test]
fn parse_template_vars() -> Result<()> {
crate::tests::setup_test_env();
let content = r#"{{OS}}"#;
let source = Source::anonymous(content);
let template = Template::parse(source)?;
let profile_vars = Variables::from_items(vec![("OS", "windows")]);
let item_vars = Variables::from_items(vec![("OS", "unix")]);
std::env::set_var("OS", "macos");
assert_eq!(
template.resolve(Some(&profile_vars), Some(&item_vars))?,
"unix"
);
let content = r#"{{#OS}}"#;
let source = Source::anonymous(content);
let template = Template::parse(source)?;
let profile_vars = Variables::from_items(vec![("OS", "windows")]);
let item_vars = Variables::from_items(vec![("OS", "unix")]);
std::env::set_var("OS", "macos");
assert_eq!(
template.resolve(Some(&profile_vars), Some(&item_vars))?,
"windows"
);
let content = r#"{{&OS}}"#;
let source = Source::anonymous(content);
let template = Template::parse(source)?;
let profile_vars = Variables::from_items(vec![("OS", "windows")]);
let item_vars = Variables::from_items(vec![("OS", "unix")]);
std::env::set_var("OS", "macos");
assert_eq!(
template.resolve(Some(&profile_vars), Some(&item_vars))?,
"unix"
);
let content = r#"{{$OS}}"#;
let source = Source::anonymous(content);
let template = Template::parse(source)?;
let profile_vars = Variables::from_items(vec![("OS", "windows")]);
let item_vars = Variables::from_items(vec![("OS", "unix")]);
std::env::set_var("OS", "macos");
assert_eq!(
template.resolve(Some(&profile_vars), Some(&item_vars))?,
"macos"
);
let content = r#"{{$#OS}}"#;
let source = Source::anonymous(content);
let template = Template::parse(source)?;
let profile_vars = Variables::from_items(vec![("OS", "windows")]);
let item_vars = Variables::from_items(vec![("OS", "unix")]);
std::env::set_var("OS", "macos");
assert_eq!(
template.resolve(Some(&profile_vars), Some(&item_vars))?,
"macos"
);
let content = r#"{{$&OS}}"#;
let source = Source::anonymous(content);
let template = Template::parse(source)?;
let profile_vars = Variables::from_items(vec![("OS", "windows")]);
let item_vars = Variables::from_items(vec![("OS", "unix")]);
std::env::remove_var("OS");
assert_eq!(
template.resolve(Some(&profile_vars), Some(&item_vars))?,
"unix"
);
Ok(())
}
}