Skip to main content

html2/
html2.rs

1use std::collections::HashSet;
2
3use menugen::{menu, menuitem, recfiltiter};
4
5#[derive(Clone, Default)]
6struct Context {
7  url: String,
8  reqperms: HashSet<String>
9}
10
11fn build_strvec<F>(it: recfiltiter::MenuIter<Context, F>) -> Vec<String>
12where
13  Context: Clone + Default,
14  F: Fn(&menuitem::MenuItem<Context>) -> bool
15{
16  let mut out = Vec::new();
17  let indent_str = String::from("  ");
18  let mut indent = 0;
19  for ev in it {
20    match ev {
21      recfiltiter::Event::EnterScope => {
22        out.push(format!("{}<ul>", indent_str.repeat(indent)));
23        indent += 1;
24      }
25      recfiltiter::Event::MenuItem(mi) => {
26        out.push(format!(
27          r#"{}<li id="{}"><a href="{}">{}</a></li>"#,
28          indent_str.repeat(indent),
29          mi.id(),
30          mi.appctx().url,
31          mi.title()
32        ));
33      }
34      recfiltiter::Event::LeaveScope => {
35        indent -= 1;
36        out.push(format!("{}</ul>", indent_str.repeat(indent)));
37      }
38    }
39  }
40  out
41}
42
43fn main() {
44  let mut mb = menu::Builder::<Context>::new();
45
46  let mut perms = HashSet::new();
47  perms.insert("adm".to_owned());
48  let mib = menuitem::Builder::new_ctx(
49    "lib",
50    "Library",
51    Context {
52      url: "https://library.org/".to_string(),
53      reqperms: perms
54    }
55  );
56  mb.add(mib);
57
58  let mut perms = HashSet::new();
59  perms.insert("adm".to_owned());
60  let mut mib = menuitem::Builder::new_ctx(
61    "lib-kb",
62    "Knowledge Base",
63    Context {
64      url: "https://library.org/kb".to_string(),
65      reqperms: perms
66    }
67  );
68  mib.parent("lib");
69  mb.add(mib);
70
71  let mut perms = HashSet::new();
72  perms.insert("adm".to_owned());
73  let mut mib = menuitem::Builder::new_ctx(
74    "lib-kb-arch",
75    "Archive",
76    Context {
77      url: "https://library.org/kb/archive".to_string(),
78      reqperms: perms
79    }
80  );
81  mib.parent("lib-kb");
82  mb.add(mib);
83
84  let mut perms = HashSet::new();
85  perms.insert("adm".to_owned());
86  let mut mib = menuitem::Builder::new_ctx(
87    "lib-secret",
88    "Secret",
89    Context {
90      url: "https://library.org/secret".to_string(),
91      reqperms: perms
92    }
93  );
94  mib.parent("lib");
95  mb.add(mib);
96
97  let mut perms = HashSet::new();
98  perms.insert("adm".to_owned());
99  let mut mib = menuitem::Builder::new_ctx(
100    "lib-secret-secret",
101    "Very Secret",
102    Context {
103      url: "https://library.org/secret/very".to_string(),
104      reqperms: perms
105    }
106  );
107  mib.parent("lib-secret");
108  mb.add(mib);
109
110  let menu = mb.build();
111
112  let mut account_perms = HashSet::new();
113  account_perms.insert("adm".to_owned());
114  let mut rit = menu.filtiter_hier(|mi| {
115    let isect = account_perms.intersection(&mi.appctx().reqperms);
116    let ret: HashSet<_> = isect.collect();
117    !ret.is_empty()
118  });
119  rit.root_scope();
120
121  let html = build_strvec(rit);
122
123  for s in html {
124    println!("{}", s);
125  }
126}
127
128// vim: set ft=rust et sw=2 ts=2 sts=2 cinoptions=2 tw=79 :