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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use std::fmt::Display;
use chumsky::{select, Parser};
use crate::{parser, Kind, Prefix, See, Table, TagType, Usage};
#[derive(Debug, Clone)]
pub struct Type {
pub header: Vec<String>,
pub prefix: Prefix,
pub name: String,
pub kind: Kind,
pub ty: String,
pub desc: Option<String>,
pub see: See,
pub usage: Option<Usage>,
}
parser!(Type, {
select! {
TagType::Comment(x) => x
}
.repeated()
.then(select! { TagType::Type(ty, desc) => (ty, desc) })
.then(See::parse())
.then(Usage::parse().or_not())
.then(select! { TagType::Expr { prefix, name, kind } => (prefix, name, kind) })
.map(
|((((header, (ty, desc)), see), usage), (prefix, name, kind))| Self {
header,
prefix: Prefix {
left: prefix.clone(),
right: prefix,
},
name,
kind,
ty,
desc,
see,
usage,
},
)
});
impl Type {
pub fn rename_tag(&mut self, tag: String) {
self.prefix.right = Some(tag);
}
pub fn is_public(&self, export: &str) -> bool {
self.kind != Kind::Local && self.prefix.left.as_deref() == Some(export)
}
}
impl Display for Type {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use crate::{description, header};
header!(
f,
format!(
"{}{}{}",
self.prefix.left.as_deref().unwrap_or_default(),
self.kind.as_char(),
self.name
),
format!(
"{}{}{}",
self.prefix.right.as_deref().unwrap_or_default(),
self.kind.as_char(),
self.name
)
)?;
description!(f, &self.header.join("\n"))?;
writeln!(f)?;
description!(f, "Type: ~")?;
let mut table = Table::new();
table.add_row([
&format!("({})", self.ty),
self.desc.as_deref().unwrap_or_default(),
]);
writeln!(f, "{table}")?;
if !self.see.refs.is_empty() {
writeln!(f, "{}", self.see)?;
}
if let Some(usage) = &self.usage {
writeln!(f, "{usage}")?;
}
Ok(())
}
}