A static site generator written in Rust
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

write.rs 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. use post::Post;
  2. use render::{render_post, render_post_listing};
  3. use std::fs;
  4. use std::path;
  5. pub fn write_post(cwd: &path::PathBuf, layout: &str, post_template: &str, post: &Post) {
  6. match fs::create_dir(cwd.join("public").join(&post.slug)) {
  7. Ok(_) => {}
  8. Err(err) => match err.kind() {
  9. std::io::ErrorKind::AlreadyExists => {}
  10. _ => panic!(err),
  11. },
  12. }
  13. fs::write(
  14. cwd.join("public").join(&post.slug).join("index.html"),
  15. render_post(layout, post_template, post),
  16. ).expect("Unable to write file");
  17. }
  18. pub fn write_post_listing(
  19. cwd: &path::PathBuf,
  20. layout: &str,
  21. post_listing_template: &str,
  22. post_item_template: &str,
  23. posts: &Vec<Post>,
  24. ) {
  25. fs::write(
  26. cwd.join("public").join("index.html"),
  27. render_post_listing(layout, post_listing_template, post_item_template, posts),
  28. ).expect("Unable to write file");
  29. }
  30. #[cfg(test)]
  31. mod tests {
  32. #[allow(unused_imports)]
  33. use super::*;
  34. #[allow(unused_imports)]
  35. use std::{env, fs};
  36. #[allow(unused_imports)]
  37. use uuid::Uuid;
  38. #[test]
  39. fn test_write_post() {
  40. let temp_dir = env::temp_dir();
  41. let working_dir = temp_dir.join(&Uuid::new_v4().to_string());
  42. fs::create_dir(&working_dir).unwrap();
  43. env::set_current_dir(&working_dir).unwrap();
  44. let cwd = env::current_dir().unwrap();
  45. fs::create_dir(cwd.join("public")).unwrap();
  46. let layout = "<html><head><title>Test</title></head><body>{{ contents }}</body></html>";
  47. let post_template = "<article><h1>{{ title }}</h1><div>{{ body }}</div></article>";
  48. let post = Post {
  49. title: String::from("Hello world"),
  50. body: String::from("Lorem ipsum dolor sit amet"),
  51. slug: String::from("hello-world"),
  52. };
  53. write_post(&cwd, &layout, &post_template, &post);
  54. let content =
  55. fs::read_to_string(cwd.join("public").join("hello-world").join("index.html")).unwrap();
  56. assert_eq!(
  57. "<html><head><title>Test</title></head><body><article><h1>Hello wor\
  58. ld</h1><div><p>Lorem ipsum dolor sit amet</p></div></article></body\
  59. ></html>",
  60. content.replace("\n", "")
  61. );
  62. fs::remove_dir_all(temp_dir.join(&working_dir)).unwrap();
  63. }
  64. #[test]
  65. fn test_write_post_listing() {
  66. let temp_dir = env::temp_dir();
  67. let working_dir = temp_dir.join(&Uuid::new_v4().to_string());
  68. fs::create_dir(&working_dir).unwrap();
  69. env::set_current_dir(&working_dir).unwrap();
  70. let cwd = env::current_dir().unwrap();
  71. fs::create_dir(cwd.join("public")).unwrap();
  72. let layout = "<html><head><title>Test</title></head><body>{{ contents }}</body></html>";
  73. let post_listing_template = "<ul>{{ post_listing }}</ul>";
  74. let post_item_template = "<li><a href=\"/{{ slug }}\">{{ title }}</a></li>";
  75. let posts = vec![
  76. Post {
  77. title: String::from("First post"),
  78. body: String::from("lorem ipsum dolor sit amet"),
  79. slug: String::from("first-post"),
  80. },
  81. Post {
  82. title: String::from("Second post"),
  83. body: String::from("lorem ipsum dolor sit amet"),
  84. slug: String::from("second-post"),
  85. },
  86. Post {
  87. title: String::from("Third post"),
  88. body: String::from("lorem ipsum dolor sit amet"),
  89. slug: String::from("third-post"),
  90. },
  91. ];
  92. write_post_listing(
  93. &cwd,
  94. &layout,
  95. &post_listing_template,
  96. &post_item_template,
  97. &posts,
  98. );
  99. assert_eq!(
  100. "<html><head><title>Test</title></head><body><ul><li><a href=\"/fir\
  101. st-post\">First post</a></li><li><a href=\"/second-post\">Second po\
  102. st</a></li><li><a href=\"/third-post\">Third post</a></li></ul></bo\
  103. dy></html>",
  104. fs::read_to_string(&cwd.join("public").join("index.html"))
  105. .unwrap()
  106. .replace("\n", ""),
  107. );
  108. fs::remove_dir_all(temp_dir.join(&working_dir)).unwrap();
  109. }
  110. }