viceroy-lib 0.17.0

Viceroy implementation details.
Documentation
use {
    crate::component::bindings::fastly::compute::{secret_store, types},
    crate::{
        error::Error,
        linking::{ComponentCtx, SessionView},
        secret_store::SecretLookup,
        wiggle_abi::SecretStoreError,
    },
    wasmtime::component::Resource,
};

impl secret_store::Host for ComponentCtx {}

impl secret_store::HostStore for ComponentCtx {
    fn open(&mut self, name: String) -> Result<Resource<secret_store::Store>, types::OpenError> {
        let handle = self
            .session_mut()
            .secret_store_handle(&name)
            .ok_or(types::OpenError::NotFound)?;
        Ok(handle.into())
    }

    fn get(
        &mut self,
        store: Resource<secret_store::Store>,
        key: String,
    ) -> Result<Option<Resource<secret_store::Secret>>, types::Error> {
        let store = store.into();
        let store_name = self
            .session()
            .secret_store_name(store)
            .ok_or_else(|| types::Error::from(SecretStoreError::InvalidSecretStoreHandle(store)))?;
        Ok(self
            .session_mut()
            .secret_handle(&store_name, &key)
            .map(From::from))
    }

    fn drop(&mut self, _store: Resource<secret_store::Store>) -> wasmtime::Result<()> {
        Ok(())
    }
}

impl secret_store::HostSecret for ComponentCtx {
    fn plaintext(
        &mut self,
        secret: Resource<secret_store::Secret>,
        max_len: u64,
    ) -> Result<Vec<u8>, types::Error> {
        let secret = secret.into();
        let lookup = self
            .session()
            .secret_lookup(secret)
            .ok_or(Error::SecretStoreError(
                SecretStoreError::InvalidSecretHandle(secret),
            ))?;

        let plaintext = match &lookup {
            SecretLookup::Standard {
                store_name,
                secret_name,
            } => self
                .session()
                .secret_stores()
                .get_store(store_name)
                .ok_or(Error::SecretStoreError(
                    SecretStoreError::InvalidSecretHandle(secret),
                ))?
                .get_secret(secret_name)
                .ok_or(Error::SecretStoreError(
                    SecretStoreError::InvalidSecretHandle(secret),
                ))?
                .plaintext(),

            SecretLookup::Injected { plaintext } => plaintext,
        };

        if plaintext.len() > usize::try_from(max_len).unwrap() {
            return Err(Error::BufferLengthError {
                buf: "plaintext",
                len: "plaintext_max_len",
            }
            .into());
        }

        Ok(plaintext.to_owned())
    }

    fn from_bytes(
        &mut self,
        plaintext: Vec<u8>,
    ) -> Result<Resource<secret_store::Secret>, types::Error> {
        Ok(self.session_mut().add_secret(plaintext).into())
    }

    fn drop(&mut self, _secret: Resource<secret_store::Secret>) -> wasmtime::Result<()> {
        Ok(())
    }
}