Skip to content

Commit 6aff395

Browse files
committed
Use eyre for error handling
`Box<dyn Error>` is not `Send`, which makes it harder to parallelize the rendering of the blog posts. `eyre::Report` fortunately does not have this problem.
1 parent 357ed1b commit 6aff395

File tree

6 files changed

+35
-21
lines changed

6 files changed

+35
-21
lines changed

Cargo.lock

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ name = "blog"
99
path = "src/blog.rs"
1010

1111
[dependencies]
12+
eyre = "0.6.8"
1213
handlebars = { version = "3", features = ["dir_source"] }
1314
lazy_static = "1.4.0"
1415
serde = "1.0"

src/blog.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
use std::error::Error;
2-
31
#[path = "lib.rs"]
42
mod lib;
53

6-
pub fn main() -> Result<(), Box<dyn Error>> {
4+
pub fn main() -> eyre::Result<()> {
75
lib::main()?;
86

97
println!("blog has been generated; you can now serve its content by running\n\

src/blogs.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use super::posts::Post;
22
use serde_derive::{Deserialize, Serialize};
3-
use std::error::Error;
43
use std::path::{Path, PathBuf};
54

65
static MANIFEST_FILE: &str = "blog.yml";
@@ -46,7 +45,7 @@ pub(crate) struct Blog {
4645
}
4746

4847
impl Blog {
49-
fn load(prefix: PathBuf, dir: &Path) -> Result<Self, Box<dyn Error>> {
48+
fn load(prefix: PathBuf, dir: &Path) -> eyre::Result<Self> {
5049
let manifest_content = std::fs::read_to_string(dir.join(MANIFEST_FILE))?;
5150
let manifest: Manifest = serde_yaml::from_str(&manifest_content)?;
5251

@@ -122,7 +121,7 @@ impl Blog {
122121

123122
/// Recursively load blogs in a directory. A blog is a directory with a `blog.yml`
124123
/// file inside it.
125-
pub(crate) fn load(base: &Path) -> Result<Vec<Blog>, Box<dyn Error>> {
124+
pub(crate) fn load(base: &Path) -> eyre::Result<Vec<Blog>> {
126125
let mut blogs = Vec::new();
127126
load_recursive(base, base, &mut blogs)?;
128127
Ok(blogs)
@@ -132,7 +131,7 @@ fn load_recursive(
132131
base: &Path,
133132
current: &Path,
134133
blogs: &mut Vec<Blog>,
135-
) -> Result<(), Box<dyn Error>> {
134+
) -> eyre::Result<()> {
136135
for entry in std::fs::read_dir(current)? {
137136
let path = entry?.path();
138137
let file_type = path.metadata()?.file_type();

src/lib.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use sass_rs::{compile_file, Options};
99
use serde_derive::Serialize;
1010
use serde_json::json;
1111
use std::convert::AsRef;
12-
use std::error::Error;
1312
use std::fs::{self, File};
1413
use std::io::{self, Write};
1514
use std::path::{Path, PathBuf};
@@ -51,7 +50,7 @@ impl<'a> Generator<'a> {
5150
fn new(
5251
out_directory: impl AsRef<Path>,
5352
posts_directory: impl AsRef<Path>,
54-
) -> Result<Self, Box<dyn Error>> {
53+
) -> eyre::Result<Self> {
5554
let mut handlebars = Handlebars::new();
5655
handlebars.set_strict_mode(true);
5756
handlebars.register_templates_directory(".hbs", "templates")?;
@@ -80,7 +79,7 @@ impl<'a> Generator<'a> {
8079
.replace(std::path::MAIN_SEPARATOR, "/")
8180
}
8281

83-
fn render(&self) -> Result<(), Box<dyn Error>> {
82+
fn render(&self) -> eyre::Result<()> {
8483
// make sure our output directory exists
8584
fs::create_dir_all(&self.out_directory)?;
8685

@@ -116,7 +115,7 @@ impl<'a> Generator<'a> {
116115
fs::write("./static/styles/vendor.css", &concatted).expect("couldn't write vendor css");
117116
}
118117

119-
fn render_blog(&self, blog: &Blog) -> Result<(), Box<dyn Error>> {
118+
fn render_blog(&self, blog: &Blog) -> eyre::Result<()> {
120119
std::fs::create_dir_all(self.out_directory.join(blog.prefix()))?;
121120

122121
let path = self.render_index(blog)?;
@@ -136,7 +135,7 @@ impl<'a> Generator<'a> {
136135
Ok(())
137136
}
138137

139-
fn render_index(&self, blog: &Blog) -> Result<PathBuf, Box<dyn Error>> {
138+
fn render_index(&self, blog: &Blog) -> eyre::Result<PathBuf> {
140139
let other_blogs: Vec<_> = self
141140
.blogs
142141
.iter()
@@ -161,7 +160,7 @@ impl<'a> Generator<'a> {
161160
Ok(path)
162161
}
163162

164-
fn render_post(&self, blog: &Blog, post: &Post) -> Result<PathBuf, Box<dyn Error>> {
163+
fn render_post(&self, blog: &Blog, post: &Post) -> eyre::Result<PathBuf> {
165164
let path = blog
166165
.prefix()
167166
.join(format!("{:04}", &post.year))
@@ -186,7 +185,7 @@ impl<'a> Generator<'a> {
186185
Ok(path)
187186
}
188187

189-
fn render_feed(&self, blog: &Blog) -> Result<(), Box<dyn Error>> {
188+
fn render_feed(&self, blog: &Blog) -> eyre::Result<()> {
190189
let posts: Vec<_> = blog.posts().iter().take(10).collect();
191190
let data = json!({
192191
"blog": blog,
@@ -198,7 +197,7 @@ impl<'a> Generator<'a> {
198197
Ok(())
199198
}
200199

201-
fn render_releases_feed(&self, blog: &Blog) -> Result<(), Box<dyn Error>> {
200+
fn render_releases_feed(&self, blog: &Blog) -> eyre::Result<()> {
202201
let posts = blog.posts().iter().cloned().collect::<Vec<_>>();
203202
let is_released: Vec<&Post> = posts.iter().filter(|post| post.release).collect();
204203
let releases: Vec<ReleasePost> = is_released
@@ -223,7 +222,7 @@ impl<'a> Generator<'a> {
223222
Ok(())
224223
}
225224

226-
fn copy_static_files(&self) -> Result<(), Box<dyn Error>> {
225+
fn copy_static_files(&self) -> eyre::Result<()> {
227226
copy_dir("static/fonts", &self.out_directory)?;
228227
copy_dir("static/images", &self.out_directory)?;
229228
copy_dir("static/styles", &self.out_directory)?;
@@ -236,7 +235,7 @@ impl<'a> Generator<'a> {
236235
name: impl AsRef<Path>,
237236
template: &str,
238237
data: serde_json::Value,
239-
) -> Result<(), Box<dyn Error>> {
238+
) -> eyre::Result<()> {
240239
let out_file = self.out_directory.join(name.as_ref());
241240
let file = File::create(out_file)?;
242241
self.handlebars.render_to_write(template, &data, file)?;
@@ -264,7 +263,7 @@ fn copy_dir(source: impl AsRef<Path>, dest: impl AsRef<Path>) -> Result<(), io::
264263
copy_inner(source, &dest)
265264
}
266265

267-
pub fn main() -> Result<(), Box<dyn Error>> {
266+
pub fn main() -> eyre::Result<()> {
268267
let blog = Generator::new("site", "posts")?;
269268

270269
blog.render()?;

src/posts.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use super::blogs::Manifest;
22
use comrak::{ComrakExtensionOptions, ComrakOptions, ComrakRenderOptions};
33
use regex::Regex;
44
use serde_derive::{Deserialize, Serialize};
5-
use std::error::Error;
65
use std::path::{Path, PathBuf};
6+
use eyre::eyre;
77

88
#[derive(Debug, PartialEq, Deserialize)]
99
struct YamlHeader {
@@ -36,7 +36,7 @@ pub(crate) struct Post {
3636
}
3737

3838
impl Post {
39-
pub(crate) fn open(path: &Path, manifest: &Manifest) -> Result<Self, Box<dyn Error>> {
39+
pub(crate) fn open(path: &Path, manifest: &Manifest) -> eyre::Result<Self> {
4040
// yeah this might blow up, but it won't
4141
let filename = path.file_name().unwrap().to_str().unwrap();
4242

@@ -52,7 +52,7 @@ impl Post {
5252
let contents = std::fs::read_to_string(path)?;
5353
if contents.len() < 5 {
5454
return Err(
55-
format!("{path:?} is empty, or too short to have valid front matter").into(),
55+
eyre!("{path:?} is empty, or too short to have valid front matter")
5656
);
5757
}
5858

0 commit comments

Comments
 (0)