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};