Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. use async_std::fs::read_to_string;
  2. use std::env;
  3. use std::ffi::OsStr;
  4. use std::fs::read_dir;
  5. use std::io::{Error, ErrorKind};
  6. use std::path::PathBuf;
  7. use crate::post::Post;
  8. pub async fn get_posts_directory_path() -> Result<PathBuf, Error> {
  9. match env::var("POSTS_DIR") {
  10. Ok(dir) => Ok(dir.into()),
  11. Err(_) => Err(Error::new(
  12. ErrorKind::Other,
  13. "Posts directory environment variable not set",
  14. )),
  15. }
  16. }
  17. pub async fn get_all_posts() -> Result<Vec<Post>, Error> {
  18. let mut posts: Vec<Post> = vec![];
  19. for file in post_directory_contents().await? {
  20. let file = file?;
  21. if let Some("json") = file.path().extension().and_then(OsStr::to_str) {
  22. let contents = read_post_from_disk(&file.path()).await?;
  23. let post = Post::from_str(&contents)?;
  24. posts.push(post);
  25. }
  26. }
  27. Ok(posts)
  28. }
  29. pub async fn get_one_post(post_id: String) -> Result<Post, Error> {
  30. let posts_dir = get_posts_directory_path().await?;
  31. let path = posts_dir.join(format!("{}.json", post_id));
  32. let contents = read_post_from_disk(&path).await?;
  33. let post = Post::from_str(&contents)?;
  34. Ok(post)
  35. }
  36. async fn read_post_from_disk(path: &PathBuf) -> Result<String, Error> {
  37. match read_to_string(&path).await {
  38. Ok(c) => Ok(c),
  39. Err(_) => Err(Error::new(
  40. ErrorKind::NotFound,
  41. format!(
  42. "Can't find post with the id '{}'",
  43. path.file_stem().unwrap().to_str().unwrap()
  44. ),
  45. )),
  46. }
  47. }
  48. async fn post_directory_contents() -> Result<std::fs::ReadDir, Error> {
  49. let path = get_posts_directory_path().await?;
  50. match read_dir(path) {
  51. Ok(f) => Ok(f),
  52. Err(_) => Err(Error::new(
  53. ErrorKind::Other,
  54. "Posts directory does not exist",
  55. )),
  56. }
  57. }