diff --git a/Cargo.lock b/Cargo.lock
index 4d63f2e37d..71aeff98be 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5377,6 +5377,7 @@ dependencies = [
"async-std",
"async-trait",
"console_error_panic_hook",
+ "derive_more",
"hyper 0.14.29",
"lazy_static",
"protox",
@@ -5384,6 +5385,7 @@ dependencies = [
"serde_json",
"serde_qs",
"tailcall",
+ "thiserror",
"tracing",
"tracing-subscriber",
"tracing-subscriber-wasm",
diff --git a/src/core/error.rs b/src/core/error.rs
index 7729479223..fcfd984a61 100644
--- a/src/core/error.rs
+++ b/src/core/error.rs
@@ -169,6 +169,10 @@ pub mod file {
#[error("Cannot write to a file in an execution spec")]
ExecutionSpecFileWriteFailed,
+
+ #[error("Cloudflare Worker Execution Error : {0}")]
+ #[from(ignore)]
+ Cloudflare(String),
}
}
diff --git a/tailcall-cloudflare/Cargo.toml b/tailcall-cloudflare/Cargo.toml
index 83aae1e5f4..e544af6859 100644
--- a/tailcall-cloudflare/Cargo.toml
+++ b/tailcall-cloudflare/Cargo.toml
@@ -25,4 +25,5 @@ serde_qs = "0.13.0"
console_error_panic_hook = "0.1.7"
protox = "0.6.0"
async-graphql-value = "7.0.3"
-
+derive_more = "0.99.17"
+thiserror = "1.0.59"
diff --git a/tailcall-cloudflare/src/error.rs b/tailcall-cloudflare/src/error.rs
new file mode 100644
index 0000000000..c84a2bb181
--- /dev/null
+++ b/tailcall-cloudflare/src/error.rs
@@ -0,0 +1,12 @@
+use derive_more::From;
+
+#[derive(From, thiserror::Error, Debug)]
+pub enum Error {
+ #[error("Worker Error")]
+ Worker(worker::Error),
+
+ #[error("File {0} was not found in bucket")]
+ MissingFileInBucket(String),
+}
+
+pub type Result = std::result::Result;
diff --git a/tailcall-cloudflare/src/file.rs b/tailcall-cloudflare/src/file.rs
index 4bb56d3d6e..b92d43de67 100644
--- a/tailcall-cloudflare/src/file.rs
+++ b/tailcall-cloudflare/src/file.rs
@@ -2,10 +2,11 @@ use std::rc::Rc;
use anyhow::anyhow;
use async_std::task::spawn_local;
+use tailcall::core::error::file::FileError;
use tailcall::core::FileIO;
use worker::Env;
-use crate::to_anyhow;
+use super::{Error, Result};
#[derive(Clone)]
pub struct CloudflareFileIO {
@@ -26,42 +27,48 @@ impl CloudflareFileIO {
unsafe impl Sync for CloudflareFileIO {}
unsafe impl Send for CloudflareFileIO {}
-async fn get(bucket: Rc, path: String) -> anyhow::Result {
- let maybe_object = bucket
- .get(path.clone())
- .execute()
- .await
- .map_err(to_anyhow)?;
- let object = maybe_object.ok_or(anyhow!("File '{}' was not found in bucket", path))?;
+async fn get(bucket: Rc, path: String) -> Result {
+ let maybe_object = bucket.get(path.clone()).execute().await?;
+ let object = maybe_object.ok_or(Error::MissingFileInBucket(path.to_string()))?;
let body = match object.body() {
- Some(body) => body.text().await.map_err(to_anyhow),
- None => Ok("".to_string()),
+ Some(body) => body.text().await?,
+ None => "".to_string(),
};
- body
+ Ok(body)
}
-async fn put(bucket: Rc, path: String, value: Vec) -> anyhow::Result<()> {
- bucket.put(path, value).execute().await.map_err(to_anyhow)?;
+async fn put(bucket: Rc, path: String, value: Vec) -> Result<()> {
+ bucket.put(path, value).execute().await?;
Ok(())
}
#[async_trait::async_trait]
impl FileIO for CloudflareFileIO {
- async fn write<'a>(&'a self, path: &'a str, content: &'a [u8]) -> anyhow::Result<()> {
+ type Error = FileError;
+
+ async fn write<'a>(
+ &'a self,
+ path: &'a str,
+ content: &'a [u8],
+ ) -> std::result::Result<(), Self::Error> {
let content = content.to_vec();
let bucket = self.bucket.clone();
let path_cloned = path.to_string();
- spawn_local(put(bucket, path_cloned, content)).await?;
+ let _ = spawn_local(put(bucket, path_cloned, content))
+ .await
+ .map_err(|e| FileError::Cloudflare(e.to_string()));
tracing::info!("File write: {} ... ok", path);
Ok(())
}
- async fn read<'a>(&'a self, path: &'a str) -> anyhow::Result {
+ async fn read<'a>(&'a self, path: &'a str) -> std::result::Result {
let bucket = self.bucket.clone();
let path_cloned = path.to_string();
- let content = spawn_local(get(bucket, path_cloned)).await?;
+ let content = spawn_local(get(bucket, path_cloned))
+ .await
+ .map_err(|e| FileError::Cloudflare(e.to_string()));
tracing::info!("File read: {} ... ok", path);
- Ok(content)
+ content
}
}
diff --git a/tailcall-cloudflare/src/lib.rs b/tailcall-cloudflare/src/lib.rs
index a1dc942447..54e1a9c265 100644
--- a/tailcall-cloudflare/src/lib.rs
+++ b/tailcall-cloudflare/src/lib.rs
@@ -4,11 +4,14 @@ use anyhow::anyhow;
mod cache;
mod env;
+mod error;
mod file;
pub mod handle;
mod http;
mod runtime;
+pub use error::{Error, Result};
+
#[worker::event(fetch)]
async fn fetch(
req: worker::Request,