From: Ian Jackson Date: Mon, 28 Dec 2020 19:44:29 +0000 (+0000) Subject: reduce monomorphisation X-Git-Tag: otter-0.2.0~109 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=944ef491cc0398c32324a4a5c91f7b93ad285cfe;p=otter.git reduce monomorphisation Signed-off-by: Ian Jackson --- diff --git a/wdriver.rs b/wdriver.rs index 7e075ec3..c688783a 100644 --- a/wdriver.rs +++ b/wdriver.rs @@ -145,36 +145,43 @@ impl<'i, } } -pub trait Subst : Clone + Sized { +pub trait Subst { fn get(&self, kw: &str) -> Option; - fn also>(&self, xl: L) -> ExtendedSubst { + fn also>(&self, xl: L) -> ExtendedSubst + where Self: Clone + Sized { ExtendedSubst(self.clone(), xl.into()) } #[throws(AE)] - fn subst>(&self, s: &S) -> String { - let s = s.as_ref(); - let re = Regex::new(r"@(\w+)@").expect("bad re!"); - let mut errs = vec![]; - let out = re.replace_all(s, |caps: ®ex::Captures| { - let kw = caps.get(1).expect("$1 missing!").as_str(); - if kw == "" { return "".to_owned() } - let v = self.get(kw); - v.unwrap_or_else(||{ - errs.push(kw.to_owned()); - "".to_owned() - }) - }); - if ! errs.is_empty() { - throw!(anyhow!("bad substitution(s) {:?} in {:?}", - &errs, s)); + fn subst>(&self, s: S) -> String + where Self: Sized { + #[throws(AE)] + fn inner(self_: &dyn Subst, s: &dyn AsRef) -> String { + let s = s.as_ref(); + let re = Regex::new(r"@(\w+)@").expect("bad re!"); + let mut errs = vec![]; + let out = re.replace_all(s, |caps: ®ex::Captures| { + let kw = caps.get(1).expect("$1 missing!").as_str(); + if kw == "" { return "".to_owned() } + let v = self_.get(kw); + v.unwrap_or_else(||{ + errs.push(kw.to_owned()); + "".to_owned() + }) + }); + if ! errs.is_empty() { + throw!(anyhow!("bad substitution(s) {:?} in {:?}", + &errs, s)); + } + out.into() } - out.into() + inner(self, &s)? } #[throws(AE)] - fn ss(&self, s: &str) -> Vec { + fn ss(&self, s: &str) -> Vec + where Self: Sized { self.subst(&s)? .trim() .split(' ') @@ -489,7 +496,7 @@ fn prepare_gameserver(cln: &cleanup_notify::Handle, ds: &DirSubst) let subst = ds.also(&[ ("command_socket", "command.socket"), ]); - let config = subst.subst(&r##" + let config = subst.subst(r##" base_dir = "@build@" public_url = "@url@"