shrs_cd_tools/
rust.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//! Utilities for rust based projects

use std::collections::HashMap;

use serde::Deserialize;
use shrs::anyhow;

use crate::query::{MetadataParser, Query, QueryBuilder, QueryBuilderError, QueryResult};

#[derive(Debug, PartialEq, Eq, Hash, Deserialize)]
pub struct CargoToml {
    pub package: Package,
}

#[derive(Debug, PartialEq, Eq, Hash, Deserialize)]
pub struct Package {
    pub name: String,
    pub version: String,
    pub edition: String,
    pub description: String,
}

fn cargo_toml_parser(query_res: &mut QueryResult, content: &String) -> anyhow::Result<()> {
    let parsed: CargoToml = toml::from_str(content)?;
    query_res.add_metadata(parsed);
    Ok(())
}

pub fn module() -> Result<Query, QueryBuilderError> {
    let metadata_parser = HashMap::from_iter([(
        String::from("Cargo.toml"),
        Box::new(cargo_toml_parser) as MetadataParser,
    )]);

    QueryBuilder::default()
        .metadata_parsers(metadata_parser)
        .files(vec![String::from("Cargo.toml")])
        .build()
}

#[cfg(test)]
mod tests {

    use shrs::anyhow;

    use super::module;
    use crate::rust::CargoToml;

    #[test]
    fn scan_rust_project() -> anyhow::Result<()> {
        let module = module()?;
        let path = std::env::current_dir()?;
        let query_res = module.scan(&path);

        let cargo_toml = query_res.get_metadata::<CargoToml>();
        println!("{:?}", cargo_toml);

        Ok(())
    }
}