ricecoder_ide/
provider.rs

1//! Provider traits and interfaces for IDE features
2
3use crate::error::IdeResult;
4use crate::types::*;
5use async_trait::async_trait;
6
7/// IDE provider trait for IDE features
8#[async_trait]
9pub trait IdeProvider: Send + Sync {
10    /// Get completions for a given context
11    async fn get_completions(&self, params: &CompletionParams) -> IdeResult<Vec<CompletionItem>>;
12
13    /// Get diagnostics for a given source
14    async fn get_diagnostics(&self, params: &DiagnosticsParams) -> IdeResult<Vec<Diagnostic>>;
15
16    /// Get hover information for a given position
17    async fn get_hover(&self, params: &HoverParams) -> IdeResult<Option<Hover>>;
18
19    /// Get definition location for a given position
20    async fn get_definition(&self, params: &DefinitionParams) -> IdeResult<Option<Location>>;
21
22    /// Check if this provider is available for the given language
23    fn is_available(&self, language: &str) -> bool;
24
25    /// Get the provider name
26    fn name(&self) -> &str;
27}
28
29/// Provider chain trait for managing provider priority
30#[async_trait]
31pub trait ProviderChain: Send + Sync {
32    /// Get completions through the provider chain
33    async fn get_completions(&self, params: &CompletionParams) -> IdeResult<Vec<CompletionItem>>;
34
35    /// Get diagnostics through the provider chain
36    async fn get_diagnostics(&self, params: &DiagnosticsParams) -> IdeResult<Vec<Diagnostic>>;
37
38    /// Get hover information through the provider chain
39    async fn get_hover(&self, params: &HoverParams) -> IdeResult<Option<Hover>>;
40
41    /// Get definition location through the provider chain
42    async fn get_definition(&self, params: &DefinitionParams) -> IdeResult<Option<Location>>;
43
44    /// Register a provider availability change callback
45    fn on_provider_availability_changed(
46        &self,
47        callback: Box<dyn Fn(ProviderChange) + Send + Sync>,
48    );
49
50    /// Reload configuration without restart
51    async fn reload_configuration(&self) -> IdeResult<()>;
52}
53
54/// Provider availability change event
55#[derive(Debug, Clone)]
56pub struct ProviderChange {
57    /// Provider name
58    pub provider_name: String,
59    /// Language
60    pub language: String,
61    /// Whether the provider became available (true) or unavailable (false)
62    pub available: bool,
63}
64
65#[cfg(test)]
66mod tests {
67    use super::*;
68
69    #[test]
70    fn test_provider_change_creation() {
71        let change = ProviderChange {
72            provider_name: "rust-analyzer".to_string(),
73            language: "rust".to_string(),
74            available: true,
75        };
76
77        assert_eq!(change.provider_name, "rust-analyzer");
78        assert_eq!(change.language, "rust");
79        assert!(change.available);
80    }
81}