#[derive(Clone, Eq, PartialEq, Debug, Default, darling::FromMeta)]
#[darling(rename_all = "snake_case")]
pub enum Backend {
#[default]
Full,
#[cfg(any(test, feature = "drink"))]
RuntimeOnly { runtime: Option<syn::Path> },
}
#[derive(Debug, Default, PartialEq, Eq, darling::FromMeta)]
pub struct E2EConfig {
#[darling(default)]
additional_contracts: String,
#[darling(default)]
environment: Option<syn::Path>,
#[darling(default)]
backend: Backend,
node_url: Option<String>,
}
impl E2EConfig {
pub fn additional_contracts(&self) -> Vec<String> {
self.additional_contracts
.split(' ')
.filter_map(|s| {
if s.is_empty() {
None
} else {
Some(s.to_owned())
}
})
.collect()
}
pub fn environment(&self) -> Option<syn::Path> {
self.environment.clone()
}
pub fn backend(&self) -> Backend {
self.backend.clone()
}
pub fn node_url(&self) -> Option<String> {
self.node_url.clone()
}
}
#[cfg(test)]
mod tests {
use super::*;
use darling::{
ast::NestedMeta,
FromMeta,
};
use quote::quote;
#[test]
fn config_works() {
let input = quote! {
additional_contracts = "adder/Cargo.toml flipper/Cargo.toml",
environment = crate::CustomEnvironment,
backend(runtime_only()),
node_url = "ws://127.0.0.1:8000"
};
let config =
E2EConfig::from_list(&NestedMeta::parse_meta_list(input).unwrap()).unwrap();
assert_eq!(
config.additional_contracts(),
vec!["adder/Cargo.toml", "flipper/Cargo.toml"]
);
assert_eq!(
config.environment(),
Some(syn::parse_quote! { crate::CustomEnvironment })
);
assert_eq!(config.backend(), Backend::RuntimeOnly { runtime: None });
assert_eq!(config.node_url(), Some(String::from("ws://127.0.0.1:8000")))
}
#[test]
fn config_works_with_custom_backend() {
let input = quote! {
backend(runtime_only(runtime = ::ink_e2e::MinimalRuntime)),
};
let config =
E2EConfig::from_list(&NestedMeta::parse_meta_list(input).unwrap()).unwrap();
assert_eq!(
config.backend(),
Backend::RuntimeOnly {
runtime: Some(syn::parse_quote! { ::ink_e2e::MinimalRuntime })
}
);
assert_eq!(config.node_url(), None)
}
}