summaryrefslogtreecommitdiff
path: root/ext/cron/lib.rs
diff options
context:
space:
mode:
authorhaturau <135221985+haturatu@users.noreply.github.com>2024-10-13 10:44:12 +0900
committerGitHub <noreply@github.com>2024-10-13 10:44:12 +0900
commitcedfd657a6a2f04d841db2b3fc3d7694de95eada (patch)
tree0d5d1c95cfd35bc46c230ea71f4dbf23aa0aaeea /ext/cron/lib.rs
parent4da77059dfd5b8d7591aa8e3b9f04386fbdce221 (diff)
parent64c304a45265705832ebb4ab4e9ef19f899ac911 (diff)
Merge branch 'denoland:main' into main
Diffstat (limited to 'ext/cron/lib.rs')
-rw-r--r--ext/cron/lib.rs42
1 files changed, 29 insertions, 13 deletions
diff --git a/ext/cron/lib.rs b/ext/cron/lib.rs
index e350e4d69..feffb5e51 100644
--- a/ext/cron/lib.rs
+++ b/ext/cron/lib.rs
@@ -7,16 +7,13 @@ use std::borrow::Cow;
use std::cell::RefCell;
use std::rc::Rc;
+pub use crate::interface::*;
use deno_core::error::get_custom_error_class;
-use deno_core::error::type_error;
-use deno_core::error::AnyError;
use deno_core::op2;
use deno_core::OpState;
use deno_core::Resource;
use deno_core::ResourceId;
-pub use crate::interface::*;
-
pub const UNSTABLE_FEATURE_NAME: &str = "cron";
deno_core::extension!(deno_cron,
@@ -49,6 +46,28 @@ impl<EH: CronHandle + 'static> Resource for CronResource<EH> {
}
}
+#[derive(Debug, thiserror::Error)]
+pub enum CronError {
+ #[error(transparent)]
+ Resource(deno_core::error::AnyError),
+ #[error("Cron name cannot exceed 64 characters: current length {0}")]
+ NameExceeded(usize),
+ #[error("Invalid cron name: only alphanumeric characters, whitespace, hyphens, and underscores are allowed")]
+ NameInvalid,
+ #[error("Cron with this name already exists")]
+ AlreadyExists,
+ #[error("Too many crons")]
+ TooManyCrons,
+ #[error("Invalid cron schedule")]
+ InvalidCron,
+ #[error("Invalid backoff schedule")]
+ InvalidBackoff,
+ #[error(transparent)]
+ AcquireError(#[from] tokio::sync::AcquireError),
+ #[error(transparent)]
+ Other(deno_core::error::AnyError),
+}
+
#[op2]
#[smi]
fn op_cron_create<C>(
@@ -56,7 +75,7 @@ fn op_cron_create<C>(
#[string] name: String,
#[string] cron_schedule: String,
#[serde] backoff_schedule: Option<Vec<u32>>,
-) -> Result<ResourceId, AnyError>
+) -> Result<ResourceId, CronError>
where
C: CronHandler + 'static,
{
@@ -90,7 +109,7 @@ async fn op_cron_next<C>(
state: Rc<RefCell<OpState>>,
#[smi] rid: ResourceId,
prev_success: bool,
-) -> Result<bool, AnyError>
+) -> Result<bool, CronError>
where
C: CronHandler + 'static,
{
@@ -102,7 +121,7 @@ where
if get_custom_error_class(&err) == Some("BadResource") {
return Ok(false);
} else {
- return Err(err);
+ return Err(CronError::Resource(err));
}
}
};
@@ -112,17 +131,14 @@ where
cron_handler.next(prev_success).await
}
-fn validate_cron_name(name: &str) -> Result<(), AnyError> {
+fn validate_cron_name(name: &str) -> Result<(), CronError> {
if name.len() > 64 {
- return Err(type_error(format!(
- "Cron name cannot exceed 64 characters: current length {}",
- name.len()
- )));
+ return Err(CronError::NameExceeded(name.len()));
}
if !name.chars().all(|c| {
c.is_ascii_whitespace() || c.is_ascii_alphanumeric() || c == '_' || c == '-'
}) {
- return Err(type_error("Invalid cron name: only alphanumeric characters, whitespace, hyphens, and underscores are allowed"));
+ return Err(CronError::NameInvalid);
}
Ok(())
}