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}