chiark / gitweb /
subst: Have substitutor handle any needle syntax
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 15 May 2022 14:09:29 +0000 (15:09 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 15 May 2022 19:26:01 +0000 (20:26 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/shapelib.rs

index d0aa4e99432b666707b3a87c9e199912a64dff34..92a606dbb2674a3c94dd9def52f93e6296ac6c78 100644 (file)
@@ -1129,13 +1129,20 @@ impl<'i> Substituting<'i> {
       },
       Dollars::Text => { },
     }
-    let needle: Cow<str> = if self.do_dollars() {
-      let token = needle.strip_prefix('_')
-        .ok_or_else(|| self.internal_err("needle has no '_'"))?;
-      format!("${{{}}}", token).into()
-    } else {
-      needle
-    };
+    let needle: Cow<str> = (move || Some({
+      if let Some(rhs) = needle.strip_prefix("${") {
+        let token = rhs.strip_suffix("}")?;
+        if self.do_dollars() { needle.into() }
+        else { format!("_{}", token).into() }
+      } else if let Some(token) = needle.strip_prefix("_") {
+        if ! self.do_dollars() { needle.into() }
+        else { format!("${{{}}}", token).into() }
+      } else {
+        return None
+      }
+    }))()
+      .ok_or_else(|| self.internal_err("needle has no '_'"))?;
+
     let (r, count) = self.subst_general_precisely(&needle, replacement)?;
     (r, count, needle)
   }