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,