Skip to main content

sqry_core/
confidence.rs

1//! Confidence metadata for analysis results.
2//!
3//! This module provides infrastructure for tracking the confidence level
4//! and limitations of analysis results. This is used primarily for Rust
5//! analysis where confidence can vary based on available tooling.
6//!
7//! # Confidence Levels
8//!
9//! - **Verified**: Full rust-analyzer integration available, results validated
10//! - **Partial**: Some features degraded, mixed confidence
11//! - **AstOnly**: Tree-sitter AST analysis only, no type inference
12
13use serde::{Deserialize, Serialize};
14
15/// Confidence level for analysis results.
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
17#[serde(rename_all = "snake_case")]
18pub enum ConfidenceLevel {
19    /// Full rust-analyzer integration, results verified
20    Verified,
21    /// Some features degraded, mixed confidence
22    #[default]
23    Partial,
24    /// Tree-sitter AST analysis only, no type inference
25    AstOnly,
26}
27
28/// Confidence metadata stored in the manifest and included in query responses.
29#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
30pub struct ConfidenceMetadata {
31    /// Overall confidence level
32    pub level: ConfidenceLevel,
33    /// List of limitations affecting the analysis
34    #[serde(default, skip_serializing_if = "Vec::is_empty")]
35    pub limitations: Vec<String>,
36    /// Features unavailable during analysis
37    #[serde(default, skip_serializing_if = "Vec::is_empty")]
38    pub unavailable_features: Vec<String>,
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn test_confidence_level_default() {
47        let level = ConfidenceLevel::default();
48        assert_eq!(level, ConfidenceLevel::Partial);
49    }
50
51    #[test]
52    fn test_confidence_level_serialization() {
53        let verified = ConfidenceLevel::Verified;
54        let json = serde_json::to_string(&verified).unwrap();
55        assert_eq!(json, "\"verified\"");
56
57        let partial = ConfidenceLevel::Partial;
58        let json = serde_json::to_string(&partial).unwrap();
59        assert_eq!(json, "\"partial\"");
60
61        let ast_only = ConfidenceLevel::AstOnly;
62        let json = serde_json::to_string(&ast_only).unwrap();
63        assert_eq!(json, "\"ast_only\"");
64    }
65
66    #[test]
67    fn test_confidence_level_deserialization() {
68        let verified: ConfidenceLevel = serde_json::from_str("\"verified\"").unwrap();
69        assert_eq!(verified, ConfidenceLevel::Verified);
70
71        let partial: ConfidenceLevel = serde_json::from_str("\"partial\"").unwrap();
72        assert_eq!(partial, ConfidenceLevel::Partial);
73
74        let ast_only: ConfidenceLevel = serde_json::from_str("\"ast_only\"").unwrap();
75        assert_eq!(ast_only, ConfidenceLevel::AstOnly);
76    }
77
78    #[test]
79    fn test_confidence_metadata_default() {
80        let meta = ConfidenceMetadata::default();
81        assert_eq!(meta.level, ConfidenceLevel::Partial);
82        assert!(meta.limitations.is_empty());
83        assert!(meta.unavailable_features.is_empty());
84    }
85
86    #[test]
87    fn test_confidence_metadata_serialization() {
88        let meta = ConfidenceMetadata {
89            level: ConfidenceLevel::AstOnly,
90            limitations: vec!["No type inference".to_string()],
91            unavailable_features: vec!["rust-analyzer".to_string()],
92        };
93
94        let json = serde_json::to_string(&meta).unwrap();
95        assert!(json.contains("\"level\":\"ast_only\""));
96        assert!(json.contains("\"limitations\""));
97        assert!(json.contains("\"No type inference\""));
98        assert!(json.contains("\"unavailable_features\""));
99        assert!(json.contains("\"rust-analyzer\""));
100    }
101
102    #[test]
103    fn test_confidence_metadata_empty_vectors_omitted() {
104        let meta = ConfidenceMetadata {
105            level: ConfidenceLevel::Verified,
106            limitations: vec![],
107            unavailable_features: vec![],
108        };
109
110        let json = serde_json::to_string(&meta).unwrap();
111        // Empty vectors should be omitted due to skip_serializing_if
112        assert!(!json.contains("\"limitations\""));
113        assert!(!json.contains("\"unavailable_features\""));
114        assert!(json.contains("\"level\":\"verified\""));
115    }
116
117    #[test]
118    fn test_confidence_metadata_roundtrip() {
119        let original = ConfidenceMetadata {
120            level: ConfidenceLevel::Partial,
121            limitations: vec!["Limited accuracy".to_string()],
122            unavailable_features: vec!["Type checking".to_string()],
123        };
124
125        let json = serde_json::to_string(&original).unwrap();
126        let deserialized: ConfidenceMetadata = serde_json::from_str(&json).unwrap();
127
128        assert_eq!(original, deserialized);
129    }
130}