Skip to main content

gr/cmds/
user.rs

1use std::{io::Write, sync::Arc};
2
3use crate::{
4    api_traits::UserInfo,
5    cli::user::UserOptions,
6    config::ConfigProperties,
7    display,
8    remote::{self, CacheType, GetRemoteCliArgs},
9    Result,
10};
11
12#[derive(Builder)]
13pub struct UserCliArgs {
14    pub username: String,
15    pub get_args: GetRemoteCliArgs,
16}
17
18impl UserCliArgs {
19    pub fn builder() -> UserCliArgsBuilder {
20        UserCliArgsBuilder::default()
21    }
22}
23
24pub fn execute(
25    options: UserOptions,
26    config: Arc<dyn ConfigProperties>,
27    domain: String,
28    path: String,
29) -> Result<()> {
30    match options {
31        UserOptions::Get(args) => {
32            let remote = remote::get_user(
33                domain,
34                path,
35                config,
36                Some(&args.get_args.cache_args),
37                CacheType::File,
38            )?;
39            get_user_details(remote, &args, std::io::stdout())
40        }
41    }
42}
43
44pub fn get_user_details<W: Write>(
45    remote: Arc<dyn UserInfo>,
46    args: &UserCliArgs,
47    mut writer: W,
48) -> Result<()> {
49    let response = remote.get(args)?;
50    display::print(&mut writer, vec![response], args.get_args.clone())?;
51    Ok(())
52}
53
54#[cfg(test)]
55mod tests {
56
57    use super::*;
58    use crate::cmds::project::Member;
59
60    struct MockUserInfo;
61
62    impl MockUserInfo {
63        fn new() -> Self {
64            MockUserInfo {}
65        }
66    }
67
68    impl UserInfo for MockUserInfo {
69        fn get_auth_user(&self) -> Result<Member> {
70            Ok(Member::builder().build().unwrap())
71        }
72
73        fn get(&self, _args: &UserCliArgs) -> Result<Member> {
74            Ok(Member::builder()
75                .username("tomsawyer".to_string())
76                .id(1)
77                .build()
78                .unwrap())
79        }
80    }
81
82    #[test]
83    fn test_get_user_details() {
84        let remote = MockUserInfo::new();
85        let args = UserCliArgs::builder()
86            .username("test".to_string())
87            .get_args(GetRemoteCliArgs::builder().build().unwrap())
88            .build()
89            .unwrap();
90        let mut writer = Vec::new();
91        get_user_details(Arc::new(remote), &args, &mut writer).unwrap();
92        assert_eq!(
93            "ID|Username\n1|tomsawyer\n",
94            String::from_utf8(writer).unwrap()
95        );
96    }
97}