From bd0776f89ebf49254c20951113f9b3b84d37514e Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 15 May 2022 15:09:29 +0100 Subject: [PATCH] subst: Have substitutor handle any needle syntax Signed-off-by: Ian Jackson --- src/shapelib.rs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/shapelib.rs b/src/shapelib.rs index d0aa4e99..92a606db 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -1129,13 +1129,20 @@ impl<'i> Substituting<'i> { }, Dollars::Text => { }, } - let needle: Cow = 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 = (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) } -- 2.30.2