fn0-worker 0.3.61

Worker binary for the fn0 FaaS platform
use crate::storage_resolver::ManifestStorageResolver;
use bytes::Bytes;
use fn0::StaticPageStorage;
use opendal::ErrorKind;
use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;

#[derive(Clone)]
pub struct StaticPageStore {
    resolver: Arc<ManifestStorageResolver>,
}

impl StaticPageStore {
    pub fn new(resolver: Arc<ManifestStorageResolver>) -> Self {
        Self { resolver }
    }
}

impl StaticPageStorage for StaticPageStore {
    fn read<'storage>(
        &'storage self,
        project_id: &'storage str,
        key: &'storage str,
    ) -> Pin<Box<dyn Future<Output = anyhow::Result<Option<Bytes>>> + Send + 'storage>> {
        Box::pin(async move {
            match self.resolver.page_operator(project_id).read(key).await {
                Ok(buffer) => Ok(Some(buffer.to_bytes())),
                Err(error) if error.kind() == ErrorKind::NotFound => Ok(None),
                Err(error) => Err(error.into()),
            }
        })
    }

    fn write<'storage>(
        &'storage self,
        project_id: &'storage str,
        key: &'storage str,
        body: Bytes,
    ) -> Pin<Box<dyn Future<Output = anyhow::Result<()>> + Send + 'storage>> {
        Box::pin(async move {
            self.resolver
                .page_operator(project_id)
                .write(key, body)
                .await?;
            Ok(())
        })
    }
}