use serde::Serialize;
#[derive(Debug, Clone, PartialEq)]
pub struct GrammarError {
pub message: String,
pub offset: usize,
pub length: usize,
pub replacements: Vec<String>,
pub rule_id: String,
}
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct TextSegment {
pub text: String,
#[serde(rename = "markup")]
pub is_markup: bool,
#[serde(skip)]
pub offset: usize,
#[serde(skip)]
pub unit_id: usize,
}
#[derive(Debug, Clone, PartialEq)]
pub struct AnnotatedText {
pub segments: Vec<TextSegment>,
}
impl From<&str> for AnnotatedText {
fn from(text: &str) -> Self {
AnnotatedText {
segments: vec![TextSegment {
text: text.to_string(),
is_markup: false,
offset: 0,
unit_id: 0,
}],
}
}
}
impl AnnotatedText {
pub fn plain_text(&self) -> String {
self.segments
.iter()
.filter(|s| !s.is_markup)
.map(|s| s.text.as_str())
.collect()
}
}
#[cfg(test)]
mod tests {
use super::TextSegment;
#[test]
fn text_segment_skips_internal_metadata_in_serde() {
let segment = TextSegment {
text: "Hello".to_string(),
is_markup: false,
offset: 12,
unit_id: 34,
};
let value = serde_json::to_value(&segment).unwrap();
assert_eq!(
value,
serde_json::json!({ "text": "Hello", "markup": false })
);
}
}