use crate::value::Source;
#[derive(Debug, Clone)]
pub struct Candidate {
pub content: String,
pub source: CandidateSource,
}
#[derive(Debug, Clone, PartialEq)]
pub enum CandidateSource {
Direct,
Heuristic { pattern: String },
Markdown { language: Option<String> },
Pattern { pattern: String },
}
impl Candidate {
pub fn direct(content: impl Into<String>) -> Self {
Self {
content: content.into(),
source: CandidateSource::Direct,
}
}
pub fn heuristic(content: impl Into<String>, pattern: impl Into<String>) -> Self {
Self {
content: content.into(),
source: CandidateSource::Heuristic {
pattern: pattern.into(),
},
}
}
pub fn markdown(content: impl Into<String>, language: Option<String>) -> Self {
Self {
content: content.into(),
source: CandidateSource::Markdown { language },
}
}
pub fn to_source(&self) -> Source {
match &self.source {
CandidateSource::Direct => Source::Direct,
CandidateSource::Heuristic { pattern } => Source::Heuristic {
pattern: pattern.clone(),
},
CandidateSource::Markdown { language } => Source::Markdown {
lang: language.clone(),
},
CandidateSource::Pattern { pattern } => Source::Heuristic {
pattern: pattern.clone(),
},
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_direct_candidate() {
let candidate = Candidate::direct(r#"{"name": "Alice"}"#);
assert_eq!(candidate.content, r#"{"name": "Alice"}"#);
assert_eq!(candidate.source, CandidateSource::Direct);
}
#[test]
fn test_heuristic_candidate() {
let candidate = Candidate::heuristic(r#"{"name": "Alice"}"#, "object");
assert_eq!(
candidate.source,
CandidateSource::Heuristic {
pattern: "object".to_string()
}
);
}
#[test]
fn test_to_source() {
let candidate = Candidate::heuristic("test", "pattern");
let source = candidate.to_source();
assert!(matches!(source, Source::Heuristic { .. }));
}
}