feat: Make application async
This commit is contained in:
+20
-23
@@ -2,15 +2,17 @@ use std::net::Ipv4Addr;
|
||||
use std::ops::Deref;
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
use async_walkdir::WalkDir;
|
||||
use futures::{Stream, StreamExt};
|
||||
use minijinja::value::ViaDeserialize;
|
||||
use minijinja::{AutoEscape, Environment, path_loader};
|
||||
use walkdir::WalkDir;
|
||||
|
||||
use crate::{get_configs_path, get_talos_path};
|
||||
|
||||
/// Transparent wrapper around minijinja::Environment that loads templates from a path and
|
||||
/// configures better defaults. It also implements IntoIter, making it possible to iterate over all
|
||||
/// the templates.
|
||||
#[derive(Clone)]
|
||||
pub struct PathEnvironment<'a> {
|
||||
env: Environment<'a>,
|
||||
path: PathBuf,
|
||||
@@ -76,6 +78,23 @@ impl<'a> PathEnvironment<'a> {
|
||||
pub(crate) fn new_patches() -> Self {
|
||||
Self::new(&get_talos_path().join("patches"))
|
||||
}
|
||||
|
||||
pub fn files(&self) -> impl Stream<Item = String> {
|
||||
// Find all templates in path
|
||||
WalkDir::new(&self.path)
|
||||
.filter_map(|e| async { e.ok() })
|
||||
.filter(|e| {
|
||||
let e = e.clone();
|
||||
async move { e.metadata().await.unwrap().is_file() }
|
||||
})
|
||||
.map(move |e| {
|
||||
e.path()
|
||||
.strip_prefix(&self.path)
|
||||
.expect("All paths should have prefix")
|
||||
.to_string_lossy()
|
||||
.to_string()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// Make PathEnvironment act like a normal Environment transparently
|
||||
@@ -86,25 +105,3 @@ impl<'a> Deref for PathEnvironment<'a> {
|
||||
&self.env
|
||||
}
|
||||
}
|
||||
|
||||
// Iterate over all the files in the path
|
||||
impl<'a, 'b> IntoIterator for &'b PathEnvironment<'a> {
|
||||
type Item = String;
|
||||
|
||||
type IntoIter = impl Iterator<Item = Self::Item>;
|
||||
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
// Find all templates in path
|
||||
WalkDir::new(&self.path)
|
||||
.into_iter()
|
||||
.filter_map(|e| e.ok())
|
||||
.filter(|e| e.metadata().unwrap().is_file())
|
||||
.map(|e| {
|
||||
e.path()
|
||||
.strip_prefix(&self.path)
|
||||
.expect("All paths should have prefix")
|
||||
.to_string_lossy()
|
||||
.to_string()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user