deps_lsp/
lib.rs

1pub mod config;
2pub mod document;
3pub mod file_watcher;
4pub mod handlers;
5pub mod progress;
6pub mod server;
7
8#[cfg(test)]
9mod test_utils;
10
11use std::sync::Arc;
12
13pub use deps_core::{DepsError, EcosystemRegistry, HttpCache, Result};
14pub use server::Backend;
15
16/// Declares an ecosystem: re-exports types and registers at runtime.
17macro_rules! ecosystem {
18    ($feature:literal, $crate_name:ident, $ecosystem:ident, [$($types:ident),* $(,)?]) => {
19        #[cfg(feature = $feature)]
20        pub use $crate_name::{$ecosystem, $($types),*};
21    };
22}
23
24/// Registers ecosystem if feature is enabled.
25macro_rules! register {
26    ($feature:literal, $ecosystem:ident, $registry:expr, $cache:expr) => {
27        #[cfg(feature = $feature)]
28        $registry.register(Arc::new($ecosystem::new(Arc::clone($cache))));
29    };
30}
31
32// =============================================================================
33// Ecosystems — to add new: 1) feature in Cargo.toml  2) add ecosystem!() + register!()
34// =============================================================================
35
36ecosystem!(
37    "cargo",
38    deps_cargo,
39    CargoEcosystem,
40    [
41        CargoParser,
42        CargoVersion,
43        CrateInfo,
44        CratesIoRegistry,
45        DependencySection,
46        DependencySource,
47        ParseResult,
48        ParsedDependency,
49        parse_cargo_toml,
50    ]
51);
52
53ecosystem!(
54    "npm",
55    deps_npm,
56    NpmEcosystem,
57    [
58        NpmDependency,
59        NpmDependencySection,
60        NpmPackage,
61        NpmParseResult,
62        NpmRegistry,
63        NpmVersion,
64        parse_package_json,
65    ]
66);
67
68ecosystem!(
69    "pypi",
70    deps_pypi,
71    PypiEcosystem,
72    [
73        PypiDependency,
74        PypiDependencySection,
75        PypiParser,
76        PypiRegistry,
77        PypiVersion,
78    ]
79);
80
81ecosystem!(
82    "go",
83    deps_go,
84    GoEcosystem,
85    [
86        GoDependency,
87        GoDirective,
88        GoParseResult,
89        GoRegistry,
90        GoVersion,
91        parse_go_mod,
92    ]
93);
94
95ecosystem!(
96    "bundler",
97    deps_bundler,
98    BundlerEcosystem,
99    [
100        BundlerDependency,
101        BundlerParseResult,
102        BundlerVersion,
103        DependencyGroup,
104        GemInfo,
105        GemfileLockParser,
106        RubyGemsRegistry,
107        parse_gemfile,
108    ]
109);
110
111ecosystem!(
112    "dart",
113    deps_dart,
114    DartEcosystem,
115    [
116        DartDependency,
117        DartParseResult,
118        DartVersion,
119        DartFormatter,
120        PackageInfo,
121        PubDevRegistry,
122        PubspecLockParser,
123        parse_pubspec_yaml,
124    ]
125);
126
127ecosystem!(
128    "maven",
129    deps_maven,
130    MavenEcosystem,
131    [
132        MavenDependency,
133        MavenParseResult,
134        MavenVersion,
135        MavenFormatter,
136        ArtifactInfo,
137        MavenCentralRegistry,
138        parse_pom_xml,
139    ]
140);
141
142ecosystem!(
143    "gradle",
144    deps_gradle,
145    GradleEcosystem,
146    [
147        GradleDependency,
148        GradleParseResult,
149        GradleVersion,
150        GradleFormatter,
151        parse_gradle,
152    ]
153);
154
155ecosystem!(
156    "swift",
157    deps_swift,
158    SwiftEcosystem,
159    [
160        SwiftDependency,
161        SwiftParseResult,
162        SwiftVersion,
163        SwiftPackage,
164        SwiftFormatter,
165        SwiftRegistry,
166        SwiftLockParser,
167        parse_package_swift,
168    ]
169);
170
171ecosystem!(
172    "composer",
173    deps_composer,
174    ComposerEcosystem,
175    [
176        ComposerDependency,
177        ComposerSection,
178        ComposerPackage,
179        ComposerParseResult,
180        PackagistRegistry,
181        ComposerVersion,
182        parse_composer_json,
183    ]
184);
185
186/// Registers all enabled ecosystems.
187pub fn register_ecosystems(registry: &EcosystemRegistry, cache: Arc<HttpCache>) {
188    register!("cargo", CargoEcosystem, registry, &cache);
189    register!("npm", NpmEcosystem, registry, &cache);
190    register!("pypi", PypiEcosystem, registry, &cache);
191    register!("go", GoEcosystem, registry, &cache);
192    register!("bundler", BundlerEcosystem, registry, &cache);
193    register!("dart", DartEcosystem, registry, &cache);
194    register!("maven", MavenEcosystem, registry, &cache);
195    register!("gradle", GradleEcosystem, registry, &cache);
196    register!("swift", SwiftEcosystem, registry, &cache);
197    register!("composer", ComposerEcosystem, registry, &cache);
198}
199
200#[cfg(test)]
201mod tests {
202    use super::*;
203
204    #[test]
205    fn test_register_ecosystems() {
206        let registry = Arc::new(EcosystemRegistry::new());
207        let cache = Arc::new(HttpCache::new());
208        register_ecosystems(&registry, Arc::clone(&cache));
209
210        #[cfg(feature = "cargo")]
211        assert!(registry.get("cargo").is_some());
212        #[cfg(feature = "npm")]
213        assert!(registry.get("npm").is_some());
214        #[cfg(feature = "pypi")]
215        assert!(registry.get("pypi").is_some());
216        #[cfg(feature = "go")]
217        assert!(registry.get("go").is_some());
218        #[cfg(feature = "bundler")]
219        assert!(registry.get("bundler").is_some());
220        #[cfg(feature = "dart")]
221        assert!(registry.get("dart").is_some());
222        #[cfg(feature = "maven")]
223        assert!(registry.get("maven").is_some());
224        #[cfg(feature = "composer")]
225        assert!(registry.get("composer").is_some());
226    }
227}