gr/cmds/
user.rs

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use std::{io::Write, sync::Arc};

use crate::{
    api_traits::UserInfo,
    cli::user::UserOptions,
    config::ConfigProperties,
    display,
    remote::{self, CacheType, GetRemoteCliArgs},
    Result,
};

#[derive(Builder)]
pub struct UserCliArgs {
    pub username: String,
    pub get_args: GetRemoteCliArgs,
}

impl UserCliArgs {
    pub fn builder() -> UserCliArgsBuilder {
        UserCliArgsBuilder::default()
    }
}

pub fn execute(
    options: UserOptions,
    config: Arc<dyn ConfigProperties>,
    domain: String,
    path: String,
) -> Result<()> {
    match options {
        UserOptions::Get(args) => {
            let remote = remote::get_user(
                domain,
                path,
                config,
                Some(&args.get_args.cache_args),
                CacheType::File,
            )?;
            get_user_details(remote, &args, std::io::stdout())
        }
    }
}

pub fn get_user_details<W: Write>(
    remote: Arc<dyn UserInfo>,
    args: &UserCliArgs,
    mut writer: W,
) -> Result<()> {
    let response = remote.get(args)?;
    display::print(&mut writer, vec![response], args.get_args.clone())?;
    Ok(())
}

#[cfg(test)]
mod tests {

    use super::*;
    use crate::cmds::project::Member;

    struct MockUserInfo;

    impl MockUserInfo {
        fn new() -> Self {
            MockUserInfo {}
        }
    }

    impl UserInfo for MockUserInfo {
        fn get_auth_user(&self) -> Result<Member> {
            Ok(Member::builder().build().unwrap())
        }

        fn get(&self, _args: &UserCliArgs) -> Result<Member> {
            Ok(Member::builder()
                .username("tomsawyer".to_string())
                .id(1)
                .build()
                .unwrap())
        }
    }

    #[test]
    fn test_get_user_details() {
        let remote = MockUserInfo::new();
        let args = UserCliArgs::builder()
            .username("test".to_string())
            .get_args(GetRemoteCliArgs::builder().build().unwrap())
            .build()
            .unwrap();
        let mut writer = Vec::new();
        get_user_details(Arc::new(remote), &args, &mut writer).unwrap();
        assert_eq!(
            "ID|Username\n1|tomsawyer\n",
            String::from_utf8(writer).unwrap()
        );
    }
}