chiark / gitweb /
apitest: Move portmanteau machinery from wdriver
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 17 May 2021 16:33:42 +0000 (17:33 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 17 May 2021 16:33:42 +0000 (17:33 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
apitest/apitest.rs
wdriver/wdriver.rs

index 7fa9474bdcbb3a1e8e0dfea0f5854e8c601b5e42..a9463421691613ae840e6f7f23c297c06e4447b5 100644 (file)
@@ -1024,3 +1024,50 @@ pub fn setup_core<O>(module_paths: &[&str], early_args: EarlyArgPredicate) ->
      wanted_tests,
    })
 }
+
+pub struct PortmanteauMember {
+  pub path: &'static str,
+  pub f: fn() -> Result<(), Explode>,
+}
+inventory::collect!(PortmanteauMember);
+
+#[macro_export]
+macro_rules! portmanteau_has {
+  ($path:literal, $mod:ident) => {
+    #[path = $path] mod $mod;
+    inventory::submit!(PortmanteauMember { path: $path, f: $mod::main });
+  }
+}
+
+#[throws(AE)]
+pub fn portmanteau_main(prefix: &str){
+  let arg = 'arg: loop {
+    for (ai, s) in env::args().enumerate() {
+      let plausible = |s: &str| s.starts_with(&format!("{}-",prefix));
+
+      break 'arg if ai == 0 {
+        let s = s.rsplitn(2,'/').next().unwrap();
+        if ! plausible(s) { continue }
+        s
+      } else {
+        let s = s.strip_prefix("--test=")
+          .expect("found non-long-option looking for --test={wdt,at}-*");
+        if ! plausible(s) {
+          panic!("found non --no-bwrap --{}-* option looking for --{}-*",
+                 prefix,prefix);
+        }
+        s
+      }.to_owned();
+    }
+    panic!("ran out of options looking for --test={}-*", prefix);
+  };
+
+  let f = inventory::iter::<PortmanteauMember>.into_iter()
+    .find_map(|pm| {
+      let n = pm.path.strip_suffix(".rs").unwrap();
+      if n == arg { Some(pm.f) } else { None }
+    })
+    .expect("unrecognosed {wdt,at}-* portanteau member");
+
+  f()?;
+}
index f4fb26019b9100a1992f7ef7314f9550de0470a6..8e9ad7eec7658b91634f300d759e3e1acb6dbff9 100644 (file)
@@ -891,52 +891,10 @@ pub fn as_usual<F: FnOnce(UsualSetup) -> Result<(), Explode>>(
 
 // ==================== portmanteau binary ====================
 
-pub struct PortmanteauMember {
-  path: &'static str,
-  f: fn() -> Result<(), Explode>,
-}
-inventory::collect!(PortmanteauMember);
-
-macro_rules! portmanteau_has {
-  ($path:literal, $mod:ident) => {
-    #[path = $path] mod $mod;
-    inventory::submit!(PortmanteauMember { path: $path, f: $mod::main });
-  }
-}
-
-#[throws(AE)]
-fn main(){
-  let arg = 'arg: loop {
-    for (ai, s) in env::args().enumerate() {
-      let plausible = |s: &str| s.starts_with("wdt-");
-
-      break 'arg if ai == 0 {
-        let s = s.rsplitn(2,'/').next().unwrap();
-        if ! plausible(s) { continue }
-        s
-      } else {
-        let s = s.strip_prefix("--test=")
-          .expect("found non-long-option looking for --test=wdt-*");
-        if ! plausible(s) {
-          panic!("found non --no-bwrap --wdt-* option looking for --wdt-*");
-        }
-        s
-      }.to_owned();
-    }
-    panic!("ran out of options looking for --test=wdt-*");
-  };
-
-  let f = inventory::iter::<PortmanteauMember>.into_iter()
-    .find_map(|pm| {
-      let n = pm.path.strip_suffix(".rs").unwrap();
-      if n == arg { Some(pm.f) } else { None }
-    })
-    .expect("unrecognosed wdt-* portanteau member");
-
-  f()?;
-}
-
 portmanteau_has!("wdt-altergame.rs", wdt_altergame);
 portmanteau_has!("wdt-hand.rs",      wdt_hand);
 portmanteau_has!("wdt-simple.rs",    wdt_simple);
 portmanteau_has!("wdt-bundles.rs",   wdt_bundles);
+
+#[throws(AE)]
+fn main() { portmanteau_main("wdt")? }