marine_test_macro_impl/
attributes.rs1use darling::FromMeta;
18use darling::ast::NestedMeta;
19
20use std::collections::HashMap;
21
22#[derive(Debug, Clone)]
24pub(crate) enum MTestAttributes {
25 SingleService(ServiceDescription),
26 MultipleServices(HashMap<String, ServiceDescription>),
27}
28
29#[derive(Debug, Default, Clone, FromMeta)]
30pub struct ServiceDescription {
31 pub config_path: String,
33
34 #[darling(default)]
36 pub modules_dir: Option<String>,
37}
38
39impl FromMeta for MTestAttributes {
40 fn from_list(items: &[NestedMeta]) -> darling::Result<Self> {
41 let single_service = ServiceDescription::from_list(items);
42 let multiple_services = HashMap::<String, ServiceDescription>::from_list(items);
43 match (single_service, multiple_services) {
44 (Ok(modules), Err(_)) => Ok(Self::SingleService(modules)),
45 (Err(_), Ok(services)) if !services.is_empty() => Ok(Self::MultipleServices(services)),
46 (Err(_), Ok(_)) => Err(darling::Error::custom(
47 r#"Need to specify "config_path" and "modules_dir" or several named services with these fields "#,
48 )),
49 (Err(error_single), Err(error_multiple)) => Err(darling::error::Error::multiple(vec![
50 error_single,
51 error_multiple,
52 ])),
53 (Ok(_), Ok(_)) => Err(darling::Error::custom(
54 "internal sdk error: marine_test attributes are ambiguous",
55 )),
56 }
57 }
58}