Skip to main content

tea_context/
diagnostic.rs

1use crate::{ConflictKey, PromptSegmentId};
2
3/// Stable prompt-compiler diagnostic classification.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
5pub enum PromptDiagnosticCode {
6    /// An exact duplicate segment was emitted only once.
7    ExactDuplicate,
8    /// A lower-precedence conflict was shadowed by a replaceable winner.
9    ConflictShadowed,
10    /// A lower-precedence claim could not override a protected winner.
11    ProtectedConflict,
12    /// A segment was omitted due to explicit budget behavior.
13    OmittedForBudget,
14    /// A segment was deterministically truncated.
15    TruncatedForBudget,
16}
17
18/// Bounded deterministic compiler diagnostic without prompt content.
19#[derive(Debug, Clone, PartialEq, Eq)]
20pub struct PromptDiagnostic {
21    code: PromptDiagnosticCode,
22    segment_id: PromptSegmentId,
23    winner_id: Option<PromptSegmentId>,
24    conflict_key: Option<ConflictKey>,
25}
26
27impl PromptDiagnostic {
28    pub(crate) const fn new(
29        code: PromptDiagnosticCode,
30        segment_id: PromptSegmentId,
31        winner_id: Option<PromptSegmentId>,
32        conflict_key: Option<ConflictKey>,
33    ) -> Self {
34        Self {
35            code,
36            segment_id,
37            winner_id,
38            conflict_key,
39        }
40    }
41    /// Returns stable diagnostic code.
42    #[must_use]
43    pub const fn code(&self) -> PromptDiagnosticCode {
44        self.code
45    }
46    /// Returns affected segment.
47    #[must_use]
48    pub const fn segment_id(&self) -> &PromptSegmentId {
49        &self.segment_id
50    }
51    /// Returns winning segment for conflict/duplicate diagnostics.
52    #[must_use]
53    pub const fn winner_id(&self) -> Option<&PromptSegmentId> {
54        self.winner_id.as_ref()
55    }
56    /// Returns affected conflict key when applicable.
57    #[must_use]
58    pub const fn conflict_key(&self) -> Option<&ConflictKey> {
59        self.conflict_key.as_ref()
60    }
61}