deps_core/
lib.rs

1//! Core abstractions for deps-lsp.
2//!
3//! This crate provides the foundational traits and utilities used across
4//! all ecosystem-specific implementations (Cargo, npm, PyPI, etc.).
5//!
6//! # Architecture
7//!
8//! deps-core defines:
9//! - **Traits**: `PackageRegistry`, `ManifestParser`, `VersionInfo`, `PackageMetadata`
10//! - **HTTP Cache**: Shared caching layer with ETag/Last-Modified validation
11//! - **Error Types**: Unified error handling across all ecosystems
12//!
13//! # Examples
14//!
15//! Implementing a registry for a new ecosystem:
16//!
17//! ```no_run
18//! use deps_core::{PackageRegistry, VersionInfo, PackageMetadata};
19//! use async_trait::async_trait;
20//!
21//! #[derive(Clone)]
22//! struct MyVersion {
23//!     version: String,
24//!     deprecated: bool,
25//! }
26//!
27//! impl VersionInfo for MyVersion {
28//!     fn version_string(&self) -> &str {
29//!         &self.version
30//!     }
31//!
32//!     fn is_yanked(&self) -> bool {
33//!         self.deprecated
34//!     }
35//! }
36//!
37//! #[derive(Clone)]
38//! struct MyMetadata {
39//!     name: String,
40//!     latest: String,
41//! }
42//!
43//! impl PackageMetadata for MyMetadata {
44//!     fn name(&self) -> &str {
45//!         &self.name
46//!     }
47//!
48//!     fn description(&self) -> Option<&str> {
49//!         None
50//!     }
51//!
52//!     fn repository(&self) -> Option<&str> {
53//!         None
54//!     }
55//!
56//!     fn documentation(&self) -> Option<&str> {
57//!         None
58//!     }
59//!
60//!     fn latest_version(&self) -> &str {
61//!         &self.latest
62//!     }
63//! }
64//!
65//! struct MyRegistry;
66//!
67//! #[async_trait]
68//! impl PackageRegistry for MyRegistry {
69//!     type Version = MyVersion;
70//!     type Metadata = MyMetadata;
71//!     type VersionReq = String;
72//!
73//!     async fn get_versions(&self, _name: &str) -> deps_core::error::Result<Vec<Self::Version>> {
74//!         Ok(vec![])
75//!     }
76//!
77//!     async fn get_latest_matching(
78//!         &self,
79//!         _name: &str,
80//!         _req: &Self::VersionReq,
81//!     ) -> deps_core::error::Result<Option<Self::Version>> {
82//!         Ok(None)
83//!     }
84//!
85//!     async fn search(&self, _query: &str, _limit: usize) -> deps_core::error::Result<Vec<Self::Metadata>> {
86//!         Ok(vec![])
87//!     }
88//! }
89//! ```
90
91pub mod cache;
92pub mod completion;
93pub mod ecosystem;
94pub mod ecosystem_registry;
95pub mod error;
96pub mod handler;
97pub mod lockfile;
98pub mod lsp_helpers;
99pub mod macros;
100pub mod parser;
101pub mod registry;
102pub mod version_matcher;
103
104// Re-export commonly used types
105pub use cache::{CachedResponse, HttpCache};
106pub use ecosystem::{Dependency, Ecosystem, EcosystemConfig, ParseResult};
107pub use ecosystem_registry::EcosystemRegistry;
108pub use error::{DepsError, Result};
109pub use handler::{
110    DiagnosticsConfig, EcosystemHandler, InlayHintsConfig, VersionStringGetter, YankedChecker,
111    generate_code_actions, generate_diagnostics, generate_hover, generate_inlay_hints,
112};
113pub use lockfile::{LockFileProvider, ResolvedPackage, ResolvedPackages, ResolvedSource};
114pub use lsp_helpers::{
115    EcosystemFormatter, generate_code_actions as lsp_generate_code_actions,
116    generate_diagnostics as lsp_generate_diagnostics, generate_hover as lsp_generate_hover,
117    generate_inlay_hints as lsp_generate_inlay_hints, is_same_major_minor, ranges_overlap,
118};
119pub use parser::{DependencyInfo, DependencySource, LoadingState, ManifestParser, ParseResultInfo};
120pub use registry::{
121    Metadata, PackageMetadata, PackageRegistry, Registry, Version, VersionInfo, find_latest_stable,
122};
123pub use version_matcher::{
124    Pep440Matcher, SemverMatcher, VersionRequirementMatcher, extract_pypi_min_version,
125    normalize_and_parse_version,
126};