polywrap_client 0.1.11

Polywrap Client implementation in rust
Documentation
use std::sync::{Arc, Mutex};

use polywrap_core::{
    error::Error, interface_implementation::InterfaceImplementations, invoker::Invoker,
    resolution::uri_resolution_context::UriResolutionContext, uri::Uri,
};

/// `Subinvoker` implements wrap invocation capabilities, and is used by the `Client` to invoke wraps.
pub struct Subinvoker {
    resolution_context: Arc<Mutex<UriResolutionContext>>,
    invoker: Arc<dyn Invoker>,
}

impl Subinvoker {
    pub fn new(
        invoker: Arc<dyn Invoker>,
        resolution_context: Arc<Mutex<UriResolutionContext>>,
    ) -> Self {
        Self {
            invoker,
            resolution_context,
        }
    }
}

impl Invoker for Subinvoker {
    fn invoke_raw(
        &self,
        uri: &Uri,
        method: &str,
        args: Option<&[u8]>,
        env: Option<&[u8]>,
        _: Option<Arc<Mutex<UriResolutionContext>>>,
    ) -> Result<Vec<u8>, Error> {
        let context = self.resolution_context.clone();
        self.invoker
            .invoke_raw(uri, method, args, env, Some(context))
    }
    fn get_implementations(&self, uri: &Uri) -> Result<Vec<Uri>, Error> {
        self.invoker.get_implementations(uri)
    }
    fn get_interfaces(&self) -> Option<InterfaceImplementations> {
        self.invoker.get_interfaces()
    }
    fn get_env_by_uri(&self, uri: &Uri) -> Option<Vec<u8>> {
        self.invoker.get_env_by_uri(uri)
    }
}