From b53b1220360fc9c6a584415225ab0d54361b9cca Mon Sep 17 00:00:00 2001 From: "Jakob L. Kreuze" Date: Sat, 6 Jun 2020 19:42:44 -0400 Subject: Return Result where possible. --- src/birka-web.rs | 121 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 74 insertions(+), 47 deletions(-) (limited to 'src') diff --git a/src/birka-web.rs b/src/birka-web.rs index c145625..359b153 100644 --- a/src/birka-web.rs +++ b/src/birka-web.rs @@ -103,8 +103,12 @@ fn thumb_filename(id: i64, filename: &str) -> String { } #[get("/posts?&")] -fn get_posts(conn: SiteState, tags: String, last: Option) -> Json> { - let tb = &conn.inner().lock().unwrap().tb; +fn get_posts(conn: SiteState, tags: String, last: Option) -> Result>> { + let tb = &conn + .inner() + .lock() + .map_err(|_| anyhow!("Could not lock database."))? + .tb; // Ensure that an empty vector is passed to `tb.query` if no tags were // specified. @@ -114,11 +118,9 @@ fn get_posts(conn: SiteState, tags: String, last: Option) -> Json) -> Json")] -fn get_post(conn: SiteState, id: i64) -> Json { - let tb = &conn.inner().lock().unwrap().tb; - let image = tb.image_by_id(id).unwrap(); - - Json(ImageResult { +fn get_post(conn: SiteState, id: i64) -> Result> { + let tb = &conn + .inner() + .lock() + .map_err(|_| anyhow!("Could not lock database."))? + .tb; + let image = tb.image_by_id(id)?; + + Ok(Json(ImageResult { id: image.id, filename: image_store_filename(image.id, &image.filename), thumb_filename: thumb_filename(image.id, &image.filename), orig_filename: image.filename.clone(), - tags: tb.tags_for_image(image.id).unwrap(), - }) + tags: tb.tags_for_image(image.id)?, + })) } #[derive(FromForm)] @@ -152,40 +158,50 @@ struct UpdateTags { } #[post("/posts/", data = "
")] -fn update_post(conn: SiteState, id: i64, form: Form) -> Json { - let tb = &conn.inner().lock().unwrap().tb; +fn update_post(conn: SiteState, id: i64, form: Form) -> Result> { + let tb = &conn + .inner() + .lock() + .map_err(|_| anyhow!("Could not lock database."))? + .tb; for tag in form.tags.split(",") { - tb.add_tag(tag).unwrap(); - tb.tag_image(id, tag).unwrap(); + tb.add_tag(tag)?; + tb.tag_image(id, tag)?; } - Json(String::from("Updated!")) + Ok(Json(String::from("Updated!"))) } #[post("/posts", data = "")] -fn put_post(conn: SiteState, content_type: &ContentType, data: Data) -> Json { - let conn = conn.inner().lock().unwrap(); +fn put_post(conn: SiteState, content_type: &ContentType, data: Data) -> Result> { + let conn = conn + .inner() + .lock() + .map_err(|_| anyhow!("Could not lock database."))?; let options = MultipartFormDataOptions::with_multipart_form_data_fields(vec![ MultipartFormDataField::text("tags"), MultipartFormDataField::raw("image") .size_limit(32 * 1024 * 1024) - .content_type_by_string(Some(multipart::mime::IMAGE_STAR)) - .unwrap(), + .content_type_by_string(Some(multipart::mime::IMAGE_STAR))?, ]); - let mut data = MultipartFormData::parse(content_type, data, options).unwrap(); - let raw = data.raw.remove("image").unwrap().remove(0); + let mut data = MultipartFormData::parse(content_type, data, options)?; + let raw = if let Some(mut data) = data.raw.remove("image") { + data.remove(0) + } else { + bail!("No `image` field.") + }; let filename = raw .file_name .unwrap_or(thread_rng().sample_iter(&Alphanumeric).take(30).collect()); let path = Path::new(&conn.image_dir).join(&filename); - let mut f = File::create(&path).unwrap(); - f.write_all(&raw.raw).unwrap(); + let mut f = File::create(&path)?; + f.write_all(&raw.raw)?; - let hash = database::hash_file(&path).unwrap(); - let id = conn.tb.import_image(&path, &hash).unwrap(); + let hash = database::hash_file(&path)?; + let id = conn.tb.import_image(&path, &hash)?; add_to_store( &Image { id, @@ -196,17 +212,21 @@ fn put_post(conn: SiteState, content_type: &ContentType, data: Data) -> Json Template { +fn index(conn: SiteState) -> Result