Mountain/Environment/LanguageFeatureProvider/ProviderLookup.rs
1//! Provider lookup and matching utilities.
2
3use CommonLibrary::{Error::CommonError::CommonError, LanguageFeature::DTO::ProviderType::ProviderType};
4use log::warn;
5use url::Url;
6
7use crate::{
8 ApplicationState::DTO::ProviderRegistrationDTO::ProviderRegistrationDTO,
9 Environment::Utility::ErrorMapping::MapApplicationStateLockErrorToCommonError,
10};
11
12pub(super) async fn get_matching_provider(
13 environment:&crate::Environment::MountainEnvironment::MountainEnvironment,
14 document_uri:&Url,
15 feature_type:ProviderType,
16) -> Result<Option<ProviderRegistrationDTO>, CommonError> {
17 let providers = environment
18 .ApplicationState
19 .Extension
20 .ProviderRegistration
21 .LanguageProviders
22 .lock()
23 .map_err(MapApplicationStateLockErrorToCommonError)?;
24 let open_documents = environment
25 .ApplicationState
26 .Feature
27 .Documents
28 .OpenDocuments
29 .lock()
30 .map_err(MapApplicationStateLockErrorToCommonError)?;
31
32 if let Some(document) = open_documents.get(document_uri.as_str()) {
33 for provider in providers.values() {
34 if provider.ProviderType == feature_type {
35 if let Some(selector_array) = provider.Selector.as_array() {
36 for selector in selector_array {
37 if let Some(language) = selector.get("language").and_then(|l| l.as_str()) {
38 if language == document.LanguageIdentifier {
39 return Ok(Some(provider.clone()));
40 }
41 }
42 }
43 }
44 }
45 }
46 }
47
48 warn!("No provider found for {:?} on document {}", feature_type, document_uri);
49 Ok(None)
50}