You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

fs.rs 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. posts.sort_by_key(|el| el.date.clone());
  19. posts.reverse();
  20. Ok(posts)
  21. }
  22. pub async fn get_one_post(slug: String) -> Result<Post, Error> {
  23. let posts_dir = get_posts_directory_path()?;
  24. let path = posts_dir.join(format!("{}.json", slug));
  25. let contents = read_post_from_disk(&path).await?;
  26. let post = Post::from_str(&contents)?;
  27. Ok(post)
  28. }
  29. pub fn delete_post(slug: String) -> Result<(), Error> {
  30. let posts_dir = get_posts_directory_path()?;
  31. let path = posts_dir.join(format!("{}.json", slug));
  32. std::fs::remove_file(path)?;
  33. Ok(())
  34. }
  35. async fn read_post_from_disk(path: &PathBuf) -> Result<String, Error> {
  36. match read_to_string(&path).await {
  37. Ok(c) => Ok(c),
  38. Err(_) => Err(Error::new(
  39. ErrorKind::NotFound,
  40. format!(
  41. "Can't find post with the id '{}'",
  42. path.file_stem().unwrap().to_str().unwrap()
  43. ),
  44. )),
  45. }
  46. }
  47. pub fn write_post_to_disk(post: &Post) -> Result<(), Error> {
  48. let mut path: PathBuf = get_posts_directory_path()?;
  49. let filename = format!("{}.json", post.slug);
  50. path = path.join(&filename);
  51. let mut file = File::create(&path)?;
  52. file.write_all(serde_json::to_string(&post)?.as_bytes())?;
  53. Ok(())
  54. }
  55. fn post_directory_contents() -> Result<std::fs::ReadDir, Error> {
  56. let path = get_posts_directory_path()?;
  57. match read_dir(path) {
  58. Ok(f) => Ok(f),
  59. Err(_) => Err(Error::new(
  60. ErrorKind::Other,
  61. "Posts directory does not exist",
  62. )),
  63. }
  64. }
  65. fn get_posts_directory_path() -> Result<PathBuf, Error> {
  66. match env::var("POSTS_DIR") {
  67. Ok(dir) => Ok(dir.into()),
  68. Err(_) => Err(Error::new(
  69. ErrorKind::Other,
  70. "Posts directory environment variable not set",
  71. )),
  72. }
  73. }