maven_toolbox/
default_impl.rs1use crate::*;
2
3pub struct DefaultUrlFetcher {}
4
5impl UrlFetcher for DefaultUrlFetcher {
6 fn fetch(&self, url: &str) -> Result<String, ResolverError> {
7 let text = ureq::get(url.into()).call().unwrap().into_string();
8 Ok(text.unwrap())
9 }
10}
11
12fn node<'a, 'input: 'a>(
13 parent: &'input roxmltree::Node,
14 tag_name: &'a str,
15) -> Option<roxmltree::Node<'a, 'input>> {
16 parent
17 .children()
18 .find(|child| child.is_element() && child.has_tag_name(tag_name))
19}
20
21fn node_text<'a, 'input: 'a>(parent: &'input roxmltree::Node, tag_name: &'a str) -> Option<String> {
22 let n = node(parent, tag_name)?;
23 n.text().map(|t| t.to_owned())
24}
25
26fn parse_gav(n: &roxmltree::Node) -> ArtifactFqn {
27 ArtifactFqn {
28 group_id: node_text(n, "groupId"),
29 artifact_id: node_text(n, "artifactId"),
30 version: node_text(n, "version"),
31 packaging: node_text(n, "type").or_else(|| node_text(n, "packaging")), }
33}
34
35fn parse_parent(n: &roxmltree::Node) -> Option<Parent> {
36 let n = node(n, "parent")?;
37 Some(Parent {
38 artifact_fqn: parse_gav(&n),
39 })
40}
41
42fn parse_dependency(n: &roxmltree::Node) -> Dependency {
43 Dependency {
44 artifact_fqn: parse_gav(n),
45 scope: node_text(n, "scope"),
46 }
47}
48
49fn parse_dependencies(n: &roxmltree::Node) -> HashMap<DependencyKey, Dependency> {
50 match node(n, "dependencies") {
51 Some(n) => n
52 .children()
53 .filter(|child| child.is_element() && child.has_tag_name("dependency"))
54 .map(|child| {
55 let dep = parse_dependency(&child);
56 (dep.get_key(), dep)
57 })
58 .collect(),
59 _ => HashMap::new(),
60 }
61}
62
63fn parse_dependency_management(n: &roxmltree::Node) -> Option<DependencyManagement> {
64 node(n, "dependencyManagement").map(|n| DependencyManagement {
65 dependencies: parse_dependencies(&n),
66 })
67}
68
69pub struct DefaultPomParser {}
70
71impl PomParser for DefaultPomParser {
72 fn parse(&self, input: String) -> Result<Project, ResolverError> {
73 let doc = roxmltree::Document::parse(&input).unwrap();
74
75 let n = doc.root();
76 let project_node = node(&n, "project")
77 .ok_or_else(|| ResolverError::invalid_data("invalid XML content, no <project> tag"))?;
78
79 Ok(Project {
80 artifact_fqn: parse_gav(&project_node),
81 parent: parse_parent(&project_node),
82 dependency_management: parse_dependency_management(&project_node),
83 dependencies: parse_dependencies(&project_node),
84 properties: HashMap::new(),
85 })
86 }
87}