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}