summaryrefslogtreecommitdiff
path: root/src/posts/fs_post_repo.rs
blob: 13f797b9bbe5f4699796fffc1e9214a37b6933ca (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use crate::posts::abstractions::post::Post;
use crate::posts::abstractions::repo::PostRepo;
use crate::posts::fs_post::FsPost;
use std::{fs, path::PathBuf};

pub struct FsPostRepo {
    dir: PathBuf,
}

impl FsPostRepo {
    pub fn with_dir(path: impl Into<PathBuf>) -> Self {
        Self { dir: path.into() }
    }
}

impl PostRepo for FsPostRepo {
    fn load(&self) -> impl IntoIterator<Item = FsPost> {
        let files = fs::read_dir(&self.dir).unwrap();
        files
            .flatten()
            .filter(|d| !d.file_name().to_string_lossy().starts_with('.'))
            .map(|d| FsPost::with_path(d.path()))
    }

    fn by_id(&self, post_id: &str) -> FsPost {
        let posts = self.load();
        posts
            .into_iter()
            .find(|p| p.get_title() == post_id)
            .unwrap()
    }
}