| 140 | } |
| 141 | |
| 142 | fn resolve<'b>(map: &PlaceholderMap, input: &'b str) -> Cow<'b, str> { |
| 143 | let parts = parse_resolvable_string(input); |
| 144 | |
| 145 | let is_known_placeholder = |part: &StringPart| match part { |
| 146 | StringPart::Verbatim(_) => false, |
| 147 | StringPart::Placeholder(placeholder) => map.contains_key(placeholder), |
| 148 | }; |
| 149 | |
| 150 | if !parts.iter().any(is_known_placeholder) { |
| 151 | return input.into(); |
| 152 | } |
| 153 | |
| 154 | let mut buffer = String::with_capacity(input.len()); |
| 155 | for part in parts { |
| 156 | match part { |
| 157 | StringPart::Verbatim(data) => buffer.push_str(data), |
| 158 | StringPart::Placeholder(placeholder) => match map.get(placeholder) { |
| 159 | Some(value) => buffer.push_str(value.deref()), |
| 160 | None => buffer |
| 161 | .write_fmt(format_args!("%{{{placeholder}}}")) |
| 162 | .unwrap(), |
| 163 | }, |
| 164 | } |
| 165 | } |
| 166 | buffer.into() |
| 167 | } |
| 168 | |
| 169 | fn resolve_path(map: &PlaceholderMap, path: &Path, base_dir: &Path) -> PathBuf { |
| 170 | let path: PathBuf = resolve(map, path.to_str().unwrap()).into_owned().into(); |