use deps_core::parser::DependencySource;
use tower_lsp_server::ls_types::Range;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SwiftDependency {
pub name: String,
pub name_range: Range,
pub version_req: Option<String>,
pub version_range: Option<Range>,
pub url: String,
pub source: DependencySource,
}
impl deps_core::parser::DependencyInfo for SwiftDependency {
fn name(&self) -> &str {
&self.name
}
fn name_range(&self) -> tower_lsp_server::ls_types::Range {
self.name_range
}
fn version_requirement(&self) -> Option<&str> {
self.version_req.as_deref()
}
fn version_range(&self) -> Option<tower_lsp_server::ls_types::Range> {
self.version_range
}
fn source(&self) -> DependencySource {
self.source.clone()
}
}
impl deps_core::ecosystem::Dependency for SwiftDependency {
fn name(&self) -> &str {
&self.name
}
fn name_range(&self) -> tower_lsp_server::ls_types::Range {
self.name_range
}
fn version_requirement(&self) -> Option<&str> {
self.version_req.as_deref()
}
fn version_range(&self) -> Option<tower_lsp_server::ls_types::Range> {
self.version_range
}
fn source(&self) -> DependencySource {
self.source.clone()
}
fn as_any(&self) -> &dyn std::any::Any {
self
}
}
#[derive(Debug, Clone)]
pub struct SwiftVersion {
pub version: String,
pub yanked: bool,
}
deps_core::impl_version!(SwiftVersion {
version: version,
yanked: yanked,
});
#[derive(Debug, Clone)]
pub struct SwiftPackage {
pub name: String,
pub description: Option<String>,
pub repository: Option<String>,
pub homepage: Option<String>,
pub latest_version: String,
}
deps_core::impl_metadata!(SwiftPackage {
name: name,
description: description,
repository: repository,
documentation: homepage,
latest_version: latest_version,
});
#[derive(Debug)]
pub struct SwiftParseResult {
pub dependencies: Vec<SwiftDependency>,
pub uri: tower_lsp_server::ls_types::Uri,
}
impl deps_core::ParseResult for SwiftParseResult {
fn dependencies(&self) -> Vec<&dyn deps_core::Dependency> {
self.dependencies
.iter()
.map(|d| d as &dyn deps_core::Dependency)
.collect()
}
fn workspace_root(&self) -> Option<&std::path::Path> {
None
}
fn uri(&self) -> &tower_lsp_server::ls_types::Uri {
&self.uri
}
fn as_any(&self) -> &dyn std::any::Any {
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use deps_core::{Dependency, Metadata, Version};
use tower_lsp_server::ls_types::Position;
#[test]
fn test_swift_dependency_registry() {
let dep = SwiftDependency {
name: "apple/swift-nio".into(),
name_range: Range::new(Position::new(0, 0), Position::new(0, 15)),
version_req: Some(">=2.0.0, <3.0.0".into()),
version_range: Some(Range::new(Position::new(0, 20), Position::new(0, 27))),
url: "https://github.com/apple/swift-nio.git".into(),
source: DependencySource::Registry,
};
assert_eq!(dep.name(), "apple/swift-nio");
assert_eq!(dep.version_requirement(), Some(">=2.0.0, <3.0.0"));
assert!(matches!(dep.source(), DependencySource::Registry));
}
#[test]
fn test_swift_version() {
let ver = SwiftVersion {
version: "2.40.0".into(),
yanked: false,
};
assert_eq!(ver.version_string(), "2.40.0");
assert!(!ver.is_yanked());
}
#[test]
fn test_swift_package_metadata() {
let pkg = SwiftPackage {
name: "apple/swift-nio".into(),
description: Some("Networking framework".into()),
repository: Some("https://github.com/apple/swift-nio".into()),
homepage: Some("https://github.com/apple/swift-nio".into()),
latest_version: "2.62.0".into(),
};
assert_eq!(pkg.name(), "apple/swift-nio");
assert_eq!(pkg.description(), Some("Networking framework"));
assert_eq!(pkg.latest_version(), "2.62.0");
}
}