crate_paths_cli_core/
item.rs

1use crate::item_kind::ItemKind;
2use check_keyword::CheckKeyword as _;
3use getset::Getters;
4use inflector::Inflector as _;
5use serde::{Deserialize, Serialize};
6
7#[derive(Clone, Debug, Deserialize, Eq, Getters, Hash, PartialEq, Serialize)]
8#[getset(get = "pub")]
9pub struct ItemEntry {
10    crate_name: String,
11    item_name: String,
12    path: String,
13    kinds: Vec<ItemKind>,
14}
15
16impl ItemEntry {
17    pub fn new(crate_name: String, item_name: String, path: String, kinds: Vec<ItemKind>) -> Self {
18        Self {
19            crate_name,
20            item_name,
21            path,
22            kinds,
23        }
24    }
25
26    pub fn safe_name(&self) -> String {
27        match self.item_name.is_keyword() {
28            true => self.item_name.clone().into_safe(),
29            false => self.item_name.clone(),
30        }
31    }
32
33    pub fn full_path(&self) -> String {
34        format!("{}::{}", self.crate_name.to_snake_case(), self.path)
35    }
36
37    pub fn into_writable(&self) -> String {
38        let kinds_str = self
39            .kinds
40            .iter()
41            .map(|k| k.to_string().to_sentence_case().to_lowercase())
42            .collect::<Vec<_>>()
43            .join(" + ");
44        let item_kind = format!("pub {} `{}`", kinds_str, self.item_name());
45        format!(
46            r#"
47			/// {}
48			pub const {}: crate_paths::Path = crate_paths::Path::new("{}");
49			"#,
50            item_kind,
51            self.safe_name(),
52            self.full_path()
53        )
54    }
55}