A static site generator written in Rust
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

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. }