Skip to main content

PackageRendering

Trait PackageRendering 

Source
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§

Source

fn format_version_for_text_edit(&self, version: &ConcreteVersion) -> String

Format version string for code action text edit.

Source

fn package_url(&self, name: &PackageName) -> String

Get package URL for hover markdown.

Provided Methods§

Source

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.

Source

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.

Source

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));
Source

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".

Implementors§