您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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