summaryrefslogtreecommitdiff
path: root/tree-viz/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tree-viz/src/main.rs')
-rw-r--r--tree-viz/src/main.rs96
1 files changed, 96 insertions, 0 deletions
diff --git a/tree-viz/src/main.rs b/tree-viz/src/main.rs
new file mode 100644
index 0000000..79964cb
--- /dev/null
+++ b/tree-viz/src/main.rs
@@ -0,0 +1,96 @@
1mod app;
2mod config;
3
4use std::{
5 env, fs,
6 path::Path,
7 sync::{mpsc, Arc, RwLock},
8 thread,
9 time::Duration,
10};
11
12use app::App;
13use console::{Key, Term};
14use notify::{Event as WatchEvent, EventKind as WatchEventKind, RecursiveMode, Watcher};
15use once_cell::sync::Lazy;
16use tree_sitter::Language;
17
18//pub static LANGUAGE: Lazy<Language> = Lazy::new(tree_sitter_rust::language);
19pub static LANGUAGE: Lazy<Language> = Lazy::new(tree_sitter_typescript::language_typescript);
20
21fn main() {
22 let mut args = env::args();
23 let _ = args.next();
24
25 let path = args.next().expect("no arg passed");
26 let query_path = args.next();
27 let src = fs::read_to_string(&path).expect("unable to read file");
28
29 let app = Arc::new(RwLock::new(App::new(
30 src.as_bytes(),
31 &path,
32 query_path.as_ref(),
33 )));
34
35 let watch_fn = |watcher_app: Arc<RwLock<App>>| {
36 move |ev| {
37 if let Ok(WatchEvent {
38 kind: WatchEventKind::Modify(..),
39 ..
40 }) = ev
41 {
42 if let Ok(mut locked) = watcher_app.try_write() {
43 locked.reload();
44 locked.draw();
45 };
46 }
47 }
48 };
49
50 let mut watcher1 = notify::recommended_watcher(watch_fn(Arc::clone(&app))).unwrap();
51 watcher1
52 .watch(Path::new(&path), RecursiveMode::NonRecursive)
53 .unwrap();
54
55 let mut watcher2 = notify::recommended_watcher(watch_fn(Arc::clone(&app))).unwrap();
56 if let Some(query_path) = query_path {
57 watcher2
58 .watch(Path::new(&query_path), RecursiveMode::NonRecursive)
59 .unwrap();
60 }
61
62 let (tx, rx) = mpsc::channel();
63 let tx0 = tx.clone();
64 thread::spawn(move || {
65 let term = Term::stdout();
66 loop {
67 if let Ok(Key::Char(ev)) = term.read_key() {
68 tx0.send(ev).unwrap();
69 }
70 }
71 });
72
73 if let Ok(locked) = app.try_read() {
74 locked.draw();
75 }
76
77 loop {
78 match rx.try_recv() {
79 Ok(ev) => {
80 if let Ok(mut locked) = app.try_write() {
81 match ev {
82 '>' => locked.increase_indent(),
83 '<' => locked.decrease_indent(),
84 'n' => locked.toggle_ranges(),
85 's' => locked.toggle_source(),
86 'r' => locked.reload(),
87 _ => (),
88 }
89 locked.draw();
90 }
91 }
92 _ => (),
93 }
94 thread::sleep(Duration::from_millis(10));
95 }
96}