maven_toolbox/
default_impl.rs

1use 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")), // TODO dirty hack
32    }
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}