use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[repr(u8)]
pub enum ContentSource {
SystemPrompt = 0,
UserInput = 1,
AgentReasoning = 2,
ExternalContent = 3,
}
impl ContentSource {
#[inline]
pub fn requires_sanitization(self) -> bool {
self == ContentSource::ExternalContent
}
#[inline]
pub fn can_override(self, other: ContentSource) -> bool {
self < other
}
}
impl std::fmt::Display for ContentSource {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ContentSource::SystemPrompt => write!(f, "system_prompt"),
ContentSource::UserInput => write!(f, "user_input"),
ContentSource::AgentReasoning => write!(f, "agent_reasoning"),
ContentSource::ExternalContent => write!(f, "external_content"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ordering_is_trust_descending() {
assert!(ContentSource::SystemPrompt < ContentSource::UserInput);
assert!(ContentSource::UserInput < ContentSource::AgentReasoning);
assert!(ContentSource::AgentReasoning < ContentSource::ExternalContent);
}
#[test]
fn requires_sanitization_only_for_external() {
assert!(!ContentSource::SystemPrompt.requires_sanitization());
assert!(!ContentSource::UserInput.requires_sanitization());
assert!(!ContentSource::AgentReasoning.requires_sanitization());
assert!(ContentSource::ExternalContent.requires_sanitization());
}
#[test]
fn can_override_respects_trust_order() {
assert!(ContentSource::SystemPrompt.can_override(ContentSource::UserInput));
assert!(ContentSource::SystemPrompt.can_override(ContentSource::ExternalContent));
assert!(!ContentSource::ExternalContent.can_override(ContentSource::SystemPrompt));
assert!(!ContentSource::UserInput.can_override(ContentSource::UserInput));
}
#[test]
fn display_names() {
assert_eq!(ContentSource::SystemPrompt.to_string(), "system_prompt");
assert_eq!(ContentSource::UserInput.to_string(), "user_input");
assert_eq!(ContentSource::AgentReasoning.to_string(), "agent_reasoning");
assert_eq!(
ContentSource::ExternalContent.to_string(),
"external_content"
);
}
}