Skip to main content

interprex_test/
text_records.rs

1use 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        // Match the GitHub adapter: valid JSON can contain adjacent hyphens
13        // only inside a string, where JSON Unicode escapes preserve them.
14        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}