summaryrefslogtreecommitdiffstats
path: root/src/sidebar.rs
blob: ecc2e2942702d7e5911b2f3be899c214b76c7a45 (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
use std::path::PathBuf;
use anyhow::Result;
use std::fmt;
use std::ffi::OsStr;

#[derive(Debug)]
pub struct TreeEntry {
    name: String,
    dir: Option<PathBuf>,
}

impl fmt::Display for TreeEntry {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.name)
    }
}


pub fn sidebar<I>(iter: I) -> Result<cursive_tree_view::TreeView<TreeEntry>>
    where I: Iterator<Item = PathBuf>
{
    let mut tv = cursive_tree_view::TreeView::default();

    iter.map(|path| {
        path.file_name()
            .and_then(OsStr::to_str)
            .map(String::from)
            .ok_or_else(|| anyhow!("UTF8 error"))
            .map(|name| {
                TreeEntry {
                    name,
                    dir: Some(path)
                }
            })
    })
    .enumerate()
    .fold(Ok(tv), |accu, (i, item)| {
        accu.and_then(|mut tv| {
            item.map(|itm| tv.insert_item(itm, cursive_tree_view::Placement::After, i))
                .map(|_| tv)
        })
    })
}