use deps_core::Ecosystem;
use deps_core::EcosystemId;
use deps_core::LicenseSource;
use deps_core::Metadata;
use deps_core::PackageName;
use deps_core::ParseResult;
use deps_core::Registry;
use deps_core::VersionReq;
use deps_core::ecosystem::BoxFuture;
use deps_core::ecosystem::private::Sealed;
use deps_core::lsp_helpers::{
DiagnosticMessages, DiagnosticPolicy, EcosystemFormatter, OsvNaming, PackageNaming,
PackageRendering, RequirementResolution, SourcePolicy,
};
use std::any::Any;
use std::sync::Arc;
pub struct StubRegistry;
impl Registry for StubRegistry {
fn get_versions<'a>(
&'a self,
_name: &'a PackageName,
) -> BoxFuture<'a, deps_core::Result<Vec<Box<dyn deps_core::Version>>>> {
Box::pin(async move { Ok(vec![]) })
}
fn get_latest_matching<'a>(
&'a self,
_name: &'a PackageName,
_req: &'a VersionReq,
) -> BoxFuture<'a, deps_core::Result<Option<Box<dyn deps_core::Version>>>> {
Box::pin(async move { Ok(None) })
}
fn search_raw<'a>(
&'a self,
_query: &'a str,
_limit: usize,
) -> BoxFuture<'a, deps_core::Result<Vec<Box<dyn Metadata>>>> {
Box::pin(async move { Ok(vec![]) })
}
fn as_any(&self) -> &dyn Any {
self
}
}
pub struct StubFormatter;
impl PackageNaming for StubFormatter {}
impl PackageRendering for StubFormatter {
fn format_version_for_text_edit(&self, version: &deps_core::ConcreteVersion) -> String {
version.to_string()
}
fn package_url(&self, name: &PackageName) -> String {
format!("https://example.com/{}", name.as_str())
}
}
impl RequirementResolution for StubFormatter {}
impl DiagnosticMessages for StubFormatter {}
impl DiagnosticPolicy for StubFormatter {}
impl SourcePolicy for StubFormatter {}
impl OsvNaming for StubFormatter {}
struct StubDependency {
name: PackageName,
version_req: VersionReq,
}
impl deps_core::Dependency for StubDependency {
fn name(&self) -> &PackageName {
&self.name
}
fn name_range(&self) -> deps_core::position::Range {
deps_core::position::Range::default()
}
fn version_requirement(&self) -> Option<&VersionReq> {
Some(&self.version_req)
}
fn version_range(&self) -> Option<deps_core::position::Range> {
None
}
fn source(&self) -> deps_core::parser::DependencySource {
deps_core::parser::DependencySource::Registry
}
fn as_any(&self) -> &dyn Any {
self
}
}
struct StubParseResult {
dep: StubDependency,
uri: url::Url,
}
impl ParseResult for StubParseResult {
fn dependencies(&self) -> Vec<&dyn deps_core::Dependency> {
vec![&self.dep]
}
fn workspace_root(&self) -> Option<&std::path::Path> {
None
}
fn uri(&self) -> &url::Url {
&self.uri
}
fn as_any(&self) -> &dyn Any {
self
}
}
pub struct TestTier3Ecosystem {
fetch_license_result: FetchLicenseBehavior,
}
enum FetchLicenseBehavior {
Returns(Vec<String>),
Pending,
}
impl TestTier3Ecosystem {
#[must_use]
pub const fn returning(license: Vec<String>) -> Self {
Self {
fetch_license_result: FetchLicenseBehavior::Returns(license),
}
}
#[must_use]
pub const fn pending() -> Self {
Self {
fetch_license_result: FetchLicenseBehavior::Pending,
}
}
}
impl Sealed for TestTier3Ecosystem {}
impl Ecosystem for TestTier3Ecosystem {
fn ecosystem_id(&self) -> EcosystemId {
EcosystemId::Dart
}
fn display_name(&self) -> &'static str {
"test-tier3"
}
fn manifest_filenames(&self) -> &[&'static str] {
&[]
}
fn parse_manifest<'a>(
&'a self,
_content: &'a str,
uri: &'a url::Url,
) -> BoxFuture<'a, deps_core::Result<Box<dyn ParseResult>>> {
let uri = uri.clone();
Box::pin(async move {
Ok(Box::new(StubParseResult {
dep: StubDependency {
name: PackageName::new("dep-0"),
version_req: VersionReq::new("=1.0.0"),
},
uri,
}) as Box<dyn ParseResult>)
})
}
fn registry(&self) -> Arc<dyn Registry> {
Arc::new(StubRegistry)
}
fn formatter(&self) -> &dyn EcosystemFormatter {
&StubFormatter
}
fn completion_insert_text(&self, _metadata: &dyn Metadata) -> Option<String> {
None
}
#[cfg(feature = "lsp-responses")]
fn complete_version<'a>(
&'a self,
_request: deps_core::completion::CompletionRequest<'a>,
_package_name: PackageName,
_prefix: String,
) -> BoxFuture<'a, deps_core::completion::Completions> {
Box::pin(async move { deps_core::completion::Completions::default() })
}
fn fetch_license<'a>(
&'a self,
_name: &'a str,
_version: &'a str,
) -> BoxFuture<'a, Vec<String>> {
match &self.fetch_license_result {
FetchLicenseBehavior::Returns(license) => {
let license = license.clone();
Box::pin(async move { license })
}
FetchLicenseBehavior::Pending => Box::pin(std::future::pending()),
}
}
fn license_source(&self) -> LicenseSource {
LicenseSource::DetectedSpdx
}
fn as_any(&self) -> &dyn Any {
self
}
}