Skip to content

Commit 8b2c6fc

Browse files
authored
refactor(ext/canvas): use concrete error type (denoland#26111)
1 parent 938a8eb commit 8b2c6fc

File tree

4 files changed

+26
-9
lines changed

4 files changed

+26
-9
lines changed

Cargo.lock

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

ext/canvas/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ deno_core.workspace = true
1818
deno_webgpu.workspace = true
1919
image = { version = "0.24.7", default-features = false, features = ["png"] }
2020
serde = { workspace = true, features = ["derive"] }
21+
thiserror.workspace = true

ext/canvas/lib.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
22

3-
use deno_core::error::type_error;
4-
use deno_core::error::AnyError;
53
use deno_core::op2;
64
use deno_core::ToJsBuffer;
75
use image::imageops::FilterType;
@@ -13,6 +11,14 @@ use serde::Deserialize;
1311
use serde::Serialize;
1412
use std::path::PathBuf;
1513

14+
#[derive(Debug, thiserror::Error)]
15+
pub enum CanvasError {
16+
#[error("Color type '{0:?}' not supported")]
17+
UnsupportedColorType(ColorType),
18+
#[error(transparent)]
19+
Image(#[from] image::ImageError),
20+
}
21+
1622
#[derive(Debug, Deserialize)]
1723
#[serde(rename_all = "snake_case")]
1824
enum ImageResizeQuality {
@@ -43,7 +49,7 @@ struct ImageProcessArgs {
4349
fn op_image_process(
4450
#[buffer] buf: &[u8],
4551
#[serde] args: ImageProcessArgs,
46-
) -> Result<ToJsBuffer, AnyError> {
52+
) -> ToJsBuffer {
4753
let view =
4854
RgbaImage::from_vec(args.width, args.height, buf.to_vec()).unwrap();
4955

@@ -105,7 +111,7 @@ fn op_image_process(
105111
}
106112
}
107113

108-
Ok(image_out.to_vec().into())
114+
image_out.to_vec().into()
109115
}
110116

111117
#[derive(Debug, Serialize)]
@@ -117,17 +123,16 @@ struct DecodedPng {
117123

118124
#[op2]
119125
#[serde]
120-
fn op_image_decode_png(#[buffer] buf: &[u8]) -> Result<DecodedPng, AnyError> {
126+
fn op_image_decode_png(
127+
#[buffer] buf: &[u8],
128+
) -> Result<DecodedPng, CanvasError> {
121129
let png = image::codecs::png::PngDecoder::new(buf)?;
122130

123131
let (width, height) = png.dimensions();
124132

125133
// TODO(@crowlKats): maybe use DynamicImage https://docs.rs/image/0.24.7/image/enum.DynamicImage.html ?
126134
if png.color_type() != ColorType::Rgba8 {
127-
return Err(type_error(format!(
128-
"Color type '{:?}' not supported",
129-
png.color_type()
130-
)));
135+
return Err(CanvasError::UnsupportedColorType(png.color_type()));
131136
}
132137

133138
// read_image will assert that the buffer is the correct size, so we need to fill it with zeros

runtime/errors.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
1212
use deno_broadcast_channel::BroadcastChannelError;
1313
use deno_cache::CacheError;
14+
use deno_canvas::CanvasError;
1415
use deno_core::error::AnyError;
1516
use deno_core::serde_json;
1617
use deno_core::url;
@@ -155,6 +156,13 @@ pub fn get_nix_error_class(error: &nix::Error) -> &'static str {
155156
}
156157
}
157158

159+
fn get_canvas_error(e: &CanvasError) -> &'static str {
160+
match e {
161+
CanvasError::UnsupportedColorType(_) => "TypeError",
162+
CanvasError::Image(_) => "Error",
163+
}
164+
}
165+
158166
pub fn get_cache_error(error: &CacheError) -> &'static str {
159167
match error {
160168
CacheError::Sqlite(_) => "Error",
@@ -186,6 +194,8 @@ pub fn get_error_class_name(e: &AnyError) -> Option<&'static str> {
186194
.or_else(|| deno_web::get_error_class_name(e))
187195
.or_else(|| deno_webstorage::get_not_supported_error_class_name(e))
188196
.or_else(|| deno_websocket::get_network_error_class_name(e))
197+
.or_else(|| deno_websocket::get_network_error_class_name(e))
198+
.or_else(|| e.downcast_ref::<CanvasError>().map(get_canvas_error))
189199
.or_else(|| e.downcast_ref::<CacheError>().map(get_cache_error))
190200
.or_else(|| {
191201
e.downcast_ref::<BroadcastChannelError>()

0 commit comments

Comments
 (0)