ricecoder_ide/
provider.rs1use crate::error::IdeResult;
4use crate::types::*;
5use async_trait::async_trait;
6
7#[async_trait]
9pub trait IdeProvider: Send + Sync {
10 async fn get_completions(&self, params: &CompletionParams) -> IdeResult<Vec<CompletionItem>>;
12
13 async fn get_diagnostics(&self, params: &DiagnosticsParams) -> IdeResult<Vec<Diagnostic>>;
15
16 async fn get_hover(&self, params: &HoverParams) -> IdeResult<Option<Hover>>;
18
19 async fn get_definition(&self, params: &DefinitionParams) -> IdeResult<Option<Location>>;
21
22 fn is_available(&self, language: &str) -> bool;
24
25 fn name(&self) -> &str;
27}
28
29#[async_trait]
31pub trait ProviderChain: Send + Sync {
32 async fn get_completions(&self, params: &CompletionParams) -> IdeResult<Vec<CompletionItem>>;
34
35 async fn get_diagnostics(&self, params: &DiagnosticsParams) -> IdeResult<Vec<Diagnostic>>;
37
38 async fn get_hover(&self, params: &HoverParams) -> IdeResult<Option<Hover>>;
40
41 async fn get_definition(&self, params: &DefinitionParams) -> IdeResult<Option<Location>>;
43
44 fn on_provider_availability_changed(
46 &self,
47 callback: Box<dyn Fn(ProviderChange) + Send + Sync>,
48 );
49
50 async fn reload_configuration(&self) -> IdeResult<()>;
52}
53
54#[derive(Debug, Clone)]
56pub struct ProviderChange {
57 pub provider_name: String,
59 pub language: String,
61 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}