smt-scope 0.1.7

A library for parsing and analysing SMT traces.
Documentation
use std::borrow::Cow;

use crate::NonMaxU32;

use super::defns;

#[derive(serde::Serialize, serde::Deserialize)]
struct TermDisplayContext<'a> {
    string_matchers: StringMatchers<'a>,
    regex_matchers: Cow<'a, [defns::TermDisplay]>,
    fallback: Cow<'a, defns::FallbackFormatter>,
}

pub type StringMatchers<'a> = Vec<(
    Cow<'a, (Cow<'static, str>, Option<NonMaxU32>)>,
    Cow<'a, defns::TermDisplay>,
)>;

impl serde::Serialize for defns::TermDisplayContext {
    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
        let (string_matchers, regex_matchers, fallback) = self.to_parts();
        let self_ = TermDisplayContext {
            string_matchers: string_matchers
                .iter()
                .map(|(k, v)| (Cow::Borrowed(k), Cow::Borrowed(v)))
                .collect(),
            regex_matchers: Cow::Borrowed(regex_matchers),
            fallback: Cow::Borrowed(fallback),
        };
        self_.serialize(serializer)
    }
}
impl<'de> serde::Deserialize<'de> for defns::TermDisplayContext {
    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
        let self_: TermDisplayContext = serde::Deserialize::deserialize(deserializer)?;
        let string_matchers = self_
            .string_matchers
            .into_iter()
            .map(|(k, v)| (k.into_owned(), v.into_owned()))
            .collect();
        let regex_matchers = self_.regex_matchers.into_owned();
        let fallback = self_.fallback.into_owned();
        Ok(Self::from_parts(string_matchers, regex_matchers, fallback))
    }
}

#[derive(serde::Serialize, serde::Deserialize)]
struct RegexMatcher<'a>(Cow<'a, str>);

impl serde::Serialize for defns::RegexMatcher {
    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
        RegexMatcher(Cow::Borrowed(self.original())).serialize(serializer)
    }
}
impl<'de> serde::Deserialize<'de> for defns::RegexMatcher {
    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
        let RegexMatcher(s) = serde::Deserialize::deserialize(deserializer)?;
        defns::RegexMatcher::new(s.into_owned()).map_err(serde::de::Error::custom)
    }
}