summaryrefslogtreecommitdiff
path: root/cli/doc/mod.rs
blob: b0f7cf60a87bf96c5d13bb190751733ad292f465 (plain)
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
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
pub mod class;
pub mod r#enum;
pub mod function;
pub mod interface;
pub mod module;
pub mod namespace;
mod node;
pub mod params;
pub mod parser;
pub mod printer;
pub mod ts_type;
pub mod ts_type_param;
pub mod type_alias;
pub mod variable;

pub use node::DocNode;
pub use node::DocNodeKind;
pub use node::Location;
pub use node::ParamDef;
pub use node::ParamKind;
pub use parser::DocParser;

#[cfg(test)]
mod tests;

pub fn find_node_by_name_recursively(
  doc_nodes: Vec<DocNode>,
  name: String,
) -> Option<DocNode> {
  let mut parts = name.splitn(2, '.');
  let name = parts.next();
  let leftover = parts.next();
  name?;
  let node = find_node_by_name(doc_nodes, name.unwrap().to_string());
  match node {
    Some(node) => match node.kind {
      DocNodeKind::Namespace => {
        if let Some(leftover) = leftover {
          find_node_by_name_recursively(
            node.namespace_def.unwrap().elements,
            leftover.to_string(),
          )
        } else {
          Some(node)
        }
      }
      _ => {
        if leftover.is_none() {
          Some(node)
        } else {
          None
        }
      }
    },
    _ => None,
  }
}

fn find_node_by_name(doc_nodes: Vec<DocNode>, name: String) -> Option<DocNode> {
  let node = doc_nodes.iter().find(|node| node.name == name);
  match node {
    Some(node) => Some(node.clone()),
    None => None,
  }
}