1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use serde::{Deserialize, Serialize};
use thiserror::Error;
/// Stable machine-readable context failure classification.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContextErrorCode {
/// An identifier, provenance value, or enum relationship is invalid.
InvalidValue,
/// A module or segment exceeds deterministic bounds.
BoundsExceeded,
/// The same canonical identity was defined inconsistently.
DuplicateIdentity,
/// Equal-precedence conflict claims are ambiguous.
AmbiguousConflict,
/// Required prompt content does not fit the configured budget.
BudgetExceeded,
/// A context provider failed without producing usable modules.
ProviderFailure,
}
/// Bounded safe context/compiler failure.
#[derive(Debug, Clone, PartialEq, Eq, Error)]
#[error("{code:?}: {message}")]
pub struct ContextError {
code: ContextErrorCode,
message: String,
}
impl ContextError {
/// Creates a bounded English technical context error.
#[must_use]
pub fn new(code: ContextErrorCode, message: impl Into<String>) -> Self {
let mut message = message.into();
if message.is_empty() {
"context operation failed".clone_into(&mut message);
}
message.retain(|character| character != '\0');
if message.len() > 4096 {
let boundary = message
.char_indices()
.map(|(index, _)| index)
.take_while(|index| *index <= 4096)
.last()
.unwrap_or(0);
message.truncate(boundary);
}
Self { code, message }
}
/// Returns the stable classification.
#[must_use]
pub const fn code(&self) -> ContextErrorCode {
self.code
}
/// Returns the bounded safe diagnostic.
#[must_use]
pub fn message(&self) -> &str {
&self.message
}
}