Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions packages/client/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use polywrap_core::{
resolvers::uri_resolution_context::UriResolutionContext,
resolvers::{
uri_resolution_context::UriPackageOrWrapper,
uri_resolver::{UriResolver, UriResolverHandler},
uri_resolver::{UriResolver, UriResolverHandler}, helpers::get_env_from_resolution_path,
},
uri::Uri,
wrapper::Wrapper,
Expand Down Expand Up @@ -89,10 +89,19 @@ impl Invoker for PolywrapClient {
.map_err(|e| Error::LoadWrapperError(e.to_string()))?;

let self_clone = self.clone();
let mut env = env;
if env.is_none() {
env = self_clone.get_env_by_uri(uri);
}

let resolution_path = resolution_context.get_resolution_path();
let resolution_path = if resolution_path.len() > 0 {
resolution_path
} else {
vec![uri.clone()]
};

let env = if env.is_some() {
env
} else {
get_env_from_resolution_path(&resolution_path, &self_clone)
};

let invoke_result = self
.invoke_wrapper_raw(wrapper, uri, method, args, env, Some(resolution_context))
Expand Down
203 changes: 103 additions & 100 deletions packages/client/tests/test_env_with_invoke.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ use polywrap_client::msgpack::msgpack;

use polywrap_core::client::ClientConfig;
use polywrap_core::file_reader::SimpleFileReader;
use polywrap_core::resolvers::recursive_resolver::RecursiveResolver;
use polywrap_core::resolvers::static_resolver::StaticResolver;
use polywrap_core::resolvers::uri_resolution_context::UriPackageOrWrapper;
use polywrap_core::resolvers::uri_resolver_like::UriResolverLike;
use polywrap_resolvers::base_resolver::BaseResolver;
use polywrap_resolvers::simple_file_resolver::FilesystemResolver;
use polywrap_tests_utils::helpers::get_tests_path;
Expand Down Expand Up @@ -236,113 +239,113 @@ fn invoke_method_with_optional_env_works_without_env() {
assert_eq!(result, None);
}

// TODO: this test requires getEnvFromUriHistory feature to be implemented
// Issue: https://github.com/polywrap/rust-client/issues/79
// #[test]
// fn env_can_be_registered_for_any_uri_in_resolution_path() {
// let wrapper_uri = get_env_wrapper_uri();
// let redirect_from_uri = Uri::try_from("mock/from").unwrap();

// let env = Env {
// str: "string".to_string(),
// optStr: None,
// optFilledStr: Some("optional string".to_string()),
// number: 10,
// optNumber: None,
// bool: true,
// optBool: None,
// en: 0,
// optEnum: None,
// object: HashMap::from([
// ("prop".to_string(), "object string".to_string()),
// ]),
// optObject: None,
// array: vec![32, 23],
// };

// // Register the env for the redirect_from_uri which will be redirected to the wrapper_uri
// {
// let client = {
// let mut envs: Envs = HashMap::new();
#[test]
fn env_can_be_registered_for_any_uri_in_resolution_path() {
let wrapper_uri = get_env_wrapper_uri();
let redirect_from_uri = Uri::try_from("mock/from").unwrap();

let env = Env {
str: "string".to_string(),
optStr: None,
optFilledStr: Some("optional string".to_string()),
number: 10,
optNumber: None,
bool: true,
optBool: None,
en: 0,
optEnum: None,
object: HashMap::from([
("prop".to_string(), "object string".to_string()),
]),
optObject: None,
array: vec![32, 23],
};

// Register the env for the redirect_from_uri which will be redirected to the wrapper_uri
{
let client = {
let mut envs: Envs = HashMap::new();

// envs.insert(redirect_from_uri.to_string(), json!(env));
envs.insert(redirect_from_uri.to_string(), json!(env));

// let resolvers = HashMap::from([
// (
// redirect_from_uri.to_string(),
// UriPackageOrWrapper::Uri(wrapper_uri.clone())
// ),
// ]);
let resolvers = HashMap::from([
(
redirect_from_uri.to_string(),
UriPackageOrWrapper::Uri(wrapper_uri.clone())
),
]);

// let file_reader = SimpleFileReader::new();
// let fs_resolver = FilesystemResolver::new(Arc::new(file_reader));
let file_reader = SimpleFileReader::new();
let fs_resolver = FilesystemResolver::new(Arc::new(file_reader));

// let base_resolver = BaseResolver::new(
// Box::new(fs_resolver),
// Box::new(StaticResolver::new(resolvers)),
// );
// let config = ClientConfig {
// envs: Some(envs),
// resolver: Arc::new(base_resolver),
// interfaces: None,
// };
// Use the RecursiveResolver because it tracks resolution path (unlike BaseResolver)
let base_resolver = RecursiveResolver::from(vec![
UriResolverLike::Resolver(Arc::new(StaticResolver::new(resolvers))),
UriResolverLike::Resolver(Arc::new(fs_resolver)),
]);
let config = ClientConfig {
envs: Some(envs),
resolver: Arc::new(base_resolver),
interfaces: None,
};

// PolywrapClient::new(config)
// };

// let result = client
// .invoke::<Env>(
// &redirect_from_uri,
// "methodRequireEnv",
// Some(&msgpack!({})),
// None,
// None,
// )
// .unwrap();

// assert_eq!(result, env);
// }

// // Register the env for the wrapper_uri which will be redirected to, from the redirect_from_uri
// {
// let client = {
// let mut envs: Envs = HashMap::new();
PolywrapClient::new(config)
};

let result = client
.invoke::<Env>(
&redirect_from_uri,
"methodRequireEnv",
Some(&msgpack!({})),
None,
None,
)
.unwrap();

assert_eq!(result, env);
}

// Register the env for the wrapper_uri which will be redirected to, from the redirect_from_uri
{
let client = {
let mut envs: Envs = HashMap::new();

// envs.insert(wrapper_uri.to_string(), json!(env));
envs.insert(wrapper_uri.to_string(), json!(env));

// let resolvers = HashMap::from([
// (
// redirect_from_uri.to_string(),
// UriPackageOrWrapper::Uri(wrapper_uri.clone())
// ),
// ]);
let resolvers = HashMap::from([
(
redirect_from_uri.to_string(),
UriPackageOrWrapper::Uri(wrapper_uri.clone())
),
]);

// let file_reader = SimpleFileReader::new();
// let fs_resolver = FilesystemResolver::new(Arc::new(file_reader));
let file_reader = SimpleFileReader::new();
let fs_resolver = FilesystemResolver::new(Arc::new(file_reader));

// let base_resolver = BaseResolver::new(
// Box::new(fs_resolver),
// Box::new(StaticResolver::new(resolvers)),
// );
// let config = ClientConfig {
// envs: Some(envs),
// resolver: Arc::new(base_resolver),
// interfaces: None,
// };
// Use the RecursiveResolver because it tracks resolution path (unlike BaseResolver)
let base_resolver = RecursiveResolver::from(vec![
UriResolverLike::Resolver(Arc::new(StaticResolver::new(resolvers))),
UriResolverLike::Resolver(Arc::new(fs_resolver)),
]);
let config = ClientConfig {
envs: Some(envs),
resolver: Arc::new(base_resolver),
interfaces: None,
};

// PolywrapClient::new(config)
// };

// let result = client
// .invoke::<Env>(
// &redirect_from_uri,
// "methodRequireEnv",
// Some(&msgpack!({})),
// None,
// None,
// )
// .unwrap();

// assert_eq!(result, env);
// }
// }
PolywrapClient::new(config)
};

let result = client
.invoke::<Env>(
&redirect_from_uri,
"methodRequireEnv",
Some(&msgpack!({})),
None,
None,
)
.unwrap();

assert_eq!(result, env);
}
}
20 changes: 18 additions & 2 deletions packages/core/src/resolvers/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use crate::{
file_reader::FileReader,
uri::Uri,
error::Error,
interface_implementation::InterfaceImplementations, client::Client, invoker::Invoker
interface_implementation::InterfaceImplementations, client::Client, invoker::Invoker, env::Env
};
use polywrap_msgpack::{msgpack};

Expand Down Expand Up @@ -101,4 +101,20 @@ pub fn get_implementations(

// if implementation_uris.contains(x)
// }
}
}

pub fn get_env_from_resolution_path<'a>(
resolution_path: &[Uri],
client: &'a dyn Client
) -> Option<&'a Env> {
for uri in resolution_path.iter() {
let env = client.get_env_by_uri(uri);

if env.is_some() {
return env;
}
}

return None;
}