use std::borrow;
use std::fmt;
use std::sync;
use crate::error::Error;
use crate::error::Result;
use crate::parser::Language;
use crate::runtime::PartialStore;
mod eager;
mod inmemory;
mod lazy;
mod ondemand;
pub use self::eager::*;
pub use self::inmemory::*;
pub use self::lazy::*;
pub use self::ondemand::*;
pub trait PartialCompiler {
fn compile(self, language: sync::Arc<Language>) -> Result<Box<dyn PartialStore + Send + Sync>>;
fn source(&self) -> &dyn PartialSource;
}
pub trait PartialSource: fmt::Debug {
fn contains(&self, name: &str) -> bool;
fn names(&self) -> Vec<&str>;
fn try_get<'a>(&'a self, name: &str) -> Option<borrow::Cow<'a, str>>;
fn get<'a>(&'a self, name: &str) -> Result<borrow::Cow<'a, str>> {
self.try_get(name).ok_or_else(|| {
let mut available: Vec<_> = self.names();
available.sort_unstable();
let available = itertools::join(available, ", ");
Error::with_msg("Unknown partial-template")
.context("requested partial", name.to_owned())
.context("available partials", available)
})
}
}