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
use soulog::*;
use crate::{archive::Archive, unwrap_opt};

macro_rules! log_attr {
    ([$entry:ident, $logger:ident] $($name:ident$(($multi:expr))?),* $(,)?) => {$(
        let _multi = true;
        $(let _multi = $multi;)?
        let attr = $entry.$name($logger.hollow());
        if _multi {
            log!(($logger.vital) $name("{attr:#?}\n") as Result);
        } else {
            log!(($logger.vital) $name("{attr:?}") as Result);
        }
    )*}
}

pub fn about(is_moc: bool, uid: String, logger: impl Logger) {
    let archive = Archive::load(logger.hollow());

    if is_moc {
        about_moc(archive, uid, logger)
    } else {
        about_entry(archive, uid, logger)
    }
}

fn about_entry(archive: Archive, uid: String, mut logger: impl Logger) {
    let error_msg = format!("Entry of uid '{uid}' not found in archive");
    let mut entry = unwrap_opt!((archive.get_entry(uid, logger.hollow())) with logger, format: About("{error_msg}"));
    std::mem::drop(error_msg);

    // Print the stuff
    log!((logger) About(""));
    log!((logger.vital) About("{}", colour_format![blue("# "), green("About Entry of uid `"), none(&entry.uid), green("`")]) as Log);
    log_attr! {
        [entry, logger]
        date(false),
        title(false),
        description(false),
        notes,
        tags,
    }
}

fn about_moc(archive: Archive, uid: String, mut logger: impl Logger) {
    let error_msg = format!("MOC of uid '{uid}' not found in archive");
    let mut moc = unwrap_opt!((archive.get_moc(uid, logger.hollow())) with logger, format: About("{error_msg}"));
    std::mem::drop(error_msg);

    // Print the stuff
    log!((logger) About(""));
    log!((logger.vital) About("{}", colour_format![blue("# "), green("About MOC of uid `"), none(&moc.uid), green("`")]) as Log);
    log_attr! {
        [moc, logger]
        tags(false),
        title(false),
        description(false),
        notes,
    }
}