Lines
0 %
Functions
Branches
100 %
use chrono::{DateTime, Utc};
use std::{
ffi::OsStr,
fs::DirEntry,
path::{Path, PathBuf},
};
pub(crate) struct IndexPath(PathBuf);
impl IndexPath {
pub(crate) fn to_path_buf(&self) -> PathBuf {
self.0.clone()
}
fn entries(&self) -> std::io::Result<impl Iterator<Item = DirEntry>> {
std::fs::read_dir(self.0.parent().unwrap()).map(|iter| {
iter.filter_map(|e| e.ok()).filter(|e| {
if e.file_name() == INDEX_NAME {
return false;
// skip entries that are not files
!e.file_type().map(|ft| ft.is_file()).unwrap_or_default()
})
pub(crate) fn file_paths(&self) -> std::io::Result<impl Iterator<Item = PathBuf>> {
self.entries().map(|f| f.map(|e| e.path()))
pub(crate) fn files(&self) -> std::io::Result<impl Iterator<Item = String>> {
self.entries()
.map(|f| f.filter_map(|path| path.file_name().to_str().map(|s| s.to_string())))
pub(crate) fn dir_name(&self) -> &OsStr {
self.0.parent().unwrap().file_name().unwrap()
pub(crate) fn date(&self) -> DateTime<Utc> {
DateTime::parse_from_rfc3339(self.dir_name().to_str().unwrap())
.unwrap()
.into()
#[derive(Debug, thiserror::Error)]
#[error("{0}")]
pub(crate) struct InvalidIndexPath(String, PathBuf);
const INDEX_NAME: &str = "index.ttl";
impl TryFrom<PathBuf> for IndexPath {
type Error = InvalidIndexPath;
fn try_from(dir: PathBuf) -> Result<Self, Self::Error> {
let file_name = if let Some(file_name) = dir.file_name() {
file_name
} else {
return Err(InvalidIndexPath(
format!("{} does not contain a file name.", dir.display()),
dir,
));
let file_name = if let Some(file_name) = file_name.to_str() {
format!(
"The name {} is not valid unicode",
file_name.to_string_lossy()
),
if DateTime::parse_from_rfc3339(file_name).is_err() {
format!("{} is not a valid rfc339 date", file_name),
let path = dir.join(INDEX_NAME);
if !path.exists() {
format!("{} does not exist", path.display()),
Ok(Self(path))
impl TryFrom<&Path> for IndexPath {
fn try_from(value: &Path) -> Result<Self, Self::Error> {
IndexPath::try_from(value.to_path_buf())
impl AsRef<Path> for IndexPath {
fn as_ref(&self) -> &Path {
&self.0