12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- use async_std::fs::read_to_string;
- use std::env;
- use std::ffi::OsStr;
- use std::fs::read_dir;
- use std::io::{Error, ErrorKind};
- use std::path::PathBuf;
-
- use crate::post::Post;
-
- pub async fn get_posts_directory_path() -> Result<PathBuf, Error> {
- match env::var("POSTS_DIR") {
- Ok(dir) => Ok(dir.into()),
- Err(_) => Err(Error::new(
- ErrorKind::Other,
- "Posts directory environment variable not set",
- )),
- }
- }
-
- pub async fn get_all_posts() -> Result<Vec<Post>, Error> {
- let mut posts: Vec<Post> = vec![];
-
- for file in post_directory_contents().await? {
- let file = file?;
- if let Some("json") = file.path().extension().and_then(OsStr::to_str) {
- let contents = read_post_from_disk(&file.path()).await?;
- let post = Post::from_str(&contents)?;
- posts.push(post);
- }
- }
-
- Ok(posts)
- }
-
- pub async fn get_one_post(post_id: String) -> Result<Post, Error> {
- let posts_dir = get_posts_directory_path().await?;
- let path = posts_dir.join(format!("{}.json", post_id));
- let contents = read_post_from_disk(&path).await?;
- let post = Post::from_str(&contents)?;
-
- Ok(post)
- }
-
- async fn read_post_from_disk(path: &PathBuf) -> Result<String, Error> {
- match read_to_string(&path).await {
- Ok(c) => Ok(c),
- Err(_) => Err(Error::new(
- ErrorKind::NotFound,
- format!(
- "Can't find post with the id '{}'",
- path.file_stem().unwrap().to_str().unwrap()
- ),
- )),
- }
- }
-
- async fn post_directory_contents() -> Result<std::fs::ReadDir, Error> {
- let path = get_posts_directory_path().await?;
-
- match read_dir(path) {
- Ok(f) => Ok(f),
- Err(_) => Err(Error::new(
- ErrorKind::Other,
- "Posts directory does not exist",
- )),
- }
- }
|