coil-wasm 0.1.1

WASM extension runtime and host APIs for the Coil framework.
Documentation
mod data_contract;

pub use data_contract::*;

use crate::grants::{HostCapabilityGrant, MetadataGrant, StorageClassGrant};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HostServiceDomain {
    Auth,
    Data,
    Storage,
    Render,
    CacheIntent,
    Network,
    Secrets,
    Jobs,
    Metadata,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AuthServiceRequest {
    Check,
    List,
    Lookup,
    TupleWrite,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DataServiceRequest {
    Read { contract: ModuleDataContract },
    Write { contract: ModuleDataContract },
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StorageServiceRequest {
    Read {
        class: StorageClassGrant,
    },
    Write {
        class: StorageClassGrant,
        bytes: u64,
    },
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RenderServiceRequest {
    Fragment { slot: String },
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CacheIntentServiceRequest {
    HintWrite,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum HostServiceRequest {
    Auth(AuthServiceRequest),
    Data(DataServiceRequest),
    Storage(StorageServiceRequest),
    Render(RenderServiceRequest),
    CacheIntent(CacheIntentServiceRequest),
    OutboundHttp {
        integration: String,
        response_bytes: u64,
    },
    SecretRead {
        secret: String,
    },
    EnqueueJob {
        queue: String,
    },
    MetadataWrite {
        kind: MetadataGrant,
    },
}

impl HostServiceRequest {
    pub fn domain(&self) -> HostServiceDomain {
        match self {
            Self::Auth(_) => HostServiceDomain::Auth,
            Self::Data(_) => HostServiceDomain::Data,
            Self::Storage(_) => HostServiceDomain::Storage,
            Self::Render(_) => HostServiceDomain::Render,
            Self::CacheIntent(_) => HostServiceDomain::CacheIntent,
            Self::OutboundHttp { .. } => HostServiceDomain::Network,
            Self::SecretRead { .. } => HostServiceDomain::Secrets,
            Self::EnqueueJob { .. } => HostServiceDomain::Jobs,
            Self::MetadataWrite { .. } => HostServiceDomain::Metadata,
        }
    }
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct HostServiceCall {
    pub grant: HostCapabilityGrant,
    pub request: HostServiceRequest,
}

impl HostServiceCall {
    pub fn new(grant: HostCapabilityGrant, request: HostServiceRequest) -> Self {
        Self { grant, request }
    }

    pub fn domain(&self) -> HostServiceDomain {
        self.request.domain()
    }
}