pub trait PackageRendering: Send + Sync {
// Required methods
fn format_version_for_text_edit(&self, version: &ConcreteVersion) -> String;
fn package_url(&self, name: &PackageName) -> String;
// Provided methods
fn format_version_replacing(
&self,
version: &ConcreteVersion,
_current: &str,
) -> String { ... }
fn format_version_replacing_for(
&self,
_dep: &dyn Dependency,
version: &ConcreteVersion,
current: &str,
) -> String { ... }
fn suppress_package_url(&self, source: &DependencySource) -> bool { ... }
fn is_position_on_dependency(
&self,
dep: &dyn Dependency,
position: Position,
) -> bool { ... }
}Expand description
How a package/version renders into manifest text edits and hover content.
Implementors guarantee that format_version_for_text_edit
and package_url — the trait’s only two required methods — produce
text safe to embed directly in a manifest or hover response for any version/name that has
already passed the workspace’s shared safety gates
(crate::is_safe_version_string, crate::is_safe_package_name). Callers may assume the
replacement-preserving methods (format_version_replacing,
format_version_replacing_for) never change a
requirement’s semantics unless the ecosystem has explicitly opted in to that transformation.
Required Methods§
Sourcefn format_version_for_text_edit(&self, version: &ConcreteVersion) -> String
fn format_version_for_text_edit(&self, version: &ConcreteVersion) -> String
Format version string for code action text edit.
Sourcefn package_url(&self, name: &PackageName) -> String
fn package_url(&self, name: &PackageName) -> String
Get package URL for hover markdown.
Provided Methods§
Sourcefn format_version_replacing(
&self,
version: &ConcreteVersion,
_current: &str,
) -> String
fn format_version_replacing( &self, version: &ConcreteVersion, _current: &str, ) -> String
Format version as a replacement for the existing requirement text
current, preserving current’s operator/pin style where the
ecosystem supports more than one.
Default: ignores current, delegating to
format_version_for_text_edit.
Override when a bare format_version_for_text_edit replacement would
silently change the requirement’s semantics — e.g. PyPI’s ==1.0.1
pin becoming >=1.0.1,<2 on “update version” would defeat the point
of pinning.
Sourcefn format_version_replacing_for(
&self,
_dep: &dyn Dependency,
version: &ConcreteVersion,
current: &str,
) -> String
fn format_version_replacing_for( &self, _dep: &dyn Dependency, version: &ConcreteVersion, current: &str, ) -> String
Like format_version_replacing, but also
carries the dependency identity version/current apply to.
Default: ignores dep, delegating to
format_version_replacing. Override when the
replacement text cannot be derived from version/current alone — e.g.
deps-github-actions’s SHA-pinned uses: owner/repo@<sha> # vX.Y.Z form, where
the new SHA for a given tag is looked up per dep.name() (a tag’s commit SHA is
per-repository, unknowable from the tag string alone) in a registry-populated
index the formatter holds a shared handle to.
Every shared call site that builds a version-update edit (the vulnerability and
unsatisfiable-requirement quickfixes, the REFACTOR-loop “update to X” actions, and
the “Update N outdated dependencies” code lens) already has dep in scope and
calls this method instead of format_version_replacing
directly, so an override here is picked up on every edit path at once.
Sourcefn suppress_package_url(&self, source: &DependencySource) -> bool
fn suppress_package_url(&self, source: &DependencySource) -> bool
Whether hover should omit Self::package_url’s heading link for a dependency
resolved against source.
Self::package_url always names the ecosystem’s default public registry (e.g.
crates.io) — correct for a plain DependencySource::Registry
dependency, but wrong for one resolved against a different registry entirely (e.g.
deps-cargo’s resolved AlternateRegistry): once live version data from that other
registry renders alongside the link, an unrelated crates.io link reads as
confirmation the link is real, which is worse than showing no link at all.
Default false — every ecosystem with only one registry concept keeps its existing
hover heading unchanged; only deps-cargo’s CargoFormatter overrides this.
§Examples
use deps_core::lsp_helpers::PackageRendering;
use deps_core::parser::DependencySource;
use deps_core::{ConcreteVersion, PackageName};
struct DefaultFormatter;
impl PackageRendering for DefaultFormatter {
fn format_version_for_text_edit(&self, version: &ConcreteVersion) -> String {
version.to_string()
}
fn package_url(&self, name: &PackageName) -> String {
name.to_string()
}
}
assert!(!DefaultFormatter.suppress_package_url(&DependencySource::Registry));Sourcefn is_position_on_dependency(
&self,
dep: &dyn Dependency,
position: Position,
) -> bool
fn is_position_on_dependency( &self, dep: &dyn Dependency, position: Position, ) -> bool
Detect if cursor position is on a dependency for code actions.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".