chiark / gitweb /
otter(!): Break up read_spec (for uploadable specs)
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 20 May 2021 00:50:33 +0000 (01:50 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 20 May 2021 00:59:08 +0000 (01:59 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/otter.rs

index d98af03b5d54625a2a355a3257762baa0299cc1d..a117733cf46dca4bdcd22bd12a097e55febb8191 100644 (file)
@@ -616,14 +616,26 @@ impl<T:SomeSpec> SpecParse for SpecRaw<T> {
 }
 impl<T> SpecRaw<T> { pub fn new() -> Self { Self(default()) } }
 
+fn spec_arg_is_path(specname: &str) -> Option<String> {
+  if specname.contains('/') {
+    Some(specname.to_string())
+  } else {
+    None
+  }
+}
+
 #[throws(AE)]
-fn read_spec<P:SpecParse>(ma: &MainOpts, specname: &str, _: P) -> P::T
+fn read_spec<P:SpecParse>(ma: &MainOpts, specname: &str, p: P) -> P::T
+{
+  let filename = spec_arg_is_path(specname).unwrap_or_else(
+    || format!("{}/{}.{}.toml", &ma.spec_dir, specname, P::S::FNCOMP)
+  );
+  read_spec_from_path(filename, p)?
+}
+
+#[throws(AE)]
+fn read_spec_from_path<P:SpecParse>(filename: String, _: P) -> P::T
 {
-  let filename = if specname.contains('/') {
-    specname.to_string()
-  } else {
-    format!("{}/{}.{}.toml", &ma.spec_dir, specname, P::S::FNCOMP)
-  };
   (||{
     let mut f = File::open(&filename).context("open")?;
     let mut buf = String::new();