interprex_test/
text_records.rs1use interprex::{ProviderTextRecord, TextRecordsProvider};
2
3use crate::FakeProvider;
4
5const CARRIER_START: &str = "<!-- ";
6const CARRIER_END: &str = "\n-->";
7
8impl TextRecordsProvider for FakeProvider {
9 fn embed_record(&self, text: &str, record: &ProviderTextRecord) -> String {
10 let payload = serde_json::to_string(record.value())
11 .expect("a provider text record contains a serde_json value");
12 let payload = payload.replace("--", "\\u002d\\u002d");
15 let carrier = format!(
16 "{CARRIER_START}{}:{}\n{payload}{CARRIER_END}",
17 record.namespace(),
18 record.name()
19 );
20 if text.is_empty() {
21 carrier
22 } else {
23 format!("{text}\n\n{carrier}")
24 }
25 }
26
27 fn extract_records(&self, text: &str) -> Vec<ProviderTextRecord> {
28 text.match_indices(CARRIER_START)
29 .filter_map(|(offset, _)| parse_carrier(&text[offset..]))
30 .collect()
31 }
32}
33
34fn parse_carrier(candidate: &str) -> Option<ProviderTextRecord> {
35 let candidate = candidate.strip_prefix(CARRIER_START)?;
36 let (identifier, body) = candidate.split_once('\n')?;
37 let (namespace, name) = identifier.split_once(':')?;
38 let payload_end = body.find(CARRIER_END)?;
39 let payload = &body[..payload_end];
40 if payload.is_empty() || payload.contains(['\n', '\r']) || payload.contains("--") {
41 return None;
42 }
43 let value = serde_json::from_str(payload).ok()?;
44 ProviderTextRecord::new(namespace, name, value).ok()
45}