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