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
|
use crate::types::*;
use serde_derive::{Deserialize, Serialize};
use structopt::StructOpt;
use std::collections::{HashMap, HashSet};
pub(crate) type Inlines = HashMap<Language, HashMap<EntityKind, HashSet<ChildrenKind>>>;
#[derive(Debug, Clone, Serialize)]
pub(crate) struct Config {
pub(super) from: String,
pub(super) to: String,
pub(super) pandoc_filters: Vec<String>,
/// Tells us in which language, which entity types should inline which children entity type in
/// their documentation.
///
/// e.g. in C++, classes should inline their children methods documentation.
pub(super) inlines: Inlines,
}
impl Config {
pub(crate) fn from_merge(mut cli: ProvidedConfig, mut conf: ProvidedConfig) -> Self {
conf.pandoc_filters.append(&mut cli.pandoc_filters);
Self {
from: cli
.from
.or(conf.from)
.unwrap_or_else(|| String::from("markdown-raw_tex")),
to: cli.to.or(conf.to).unwrap_or_else(|| String::from("html")),
pandoc_filters: conf.pandoc_filters,
inlines: conf.inlines.unwrap_or_else(default_inlines),
}
}
}
fn default_inlines() -> Inlines {
let mut clang = HashMap::new();
let mut clang_inline_children = HashSet::new();
clang_inline_children.insert(ChildrenKind(String::from("variables")));
clang_inline_children.insert(ChildrenKind(String::from("fields")));
clang_inline_children.insert(ChildrenKind(String::from("functions")));
clang_inline_children.insert(ChildrenKind(String::from("methods")));
clang.insert(
EntityKind(String::from("struct")),
clang_inline_children.clone(),
);
clang.insert(
EntityKind(String::from("class")),
clang_inline_children.clone(),
);
clang.insert(EntityKind(String::from("namespace")), clang_inline_children);
let mut inlines = HashMap::new();
inlines.insert(Language::Clang, clang);
inlines
}
impl Default for Config {
fn default() -> Self {
Config::from_merge(ProvidedConfig::default(), ProvidedConfig::default())
}
}
#[derive(Debug, Clone, Default, StructOpt, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct ProvidedConfig {
#[structopt(long = "generator-from")]
pub(super) from: Option<String>,
#[structopt(long = "generator-to")]
pub(super) to: Option<String>,
#[structopt(long = "generator-pandoc-filters", number_of_values = 1)]
pub(super) pandoc_filters: Vec<String>,
#[structopt(skip)]
pub(super) inlines: Option<Inlines>,
}
|