Skip to main content

gr/cmds/
my.rs

1use std::{io::Write, sync::Arc};
2
3use crate::{
4    api_traits::RemoteProject,
5    cli::my::MyOptions,
6    config::ConfigProperties,
7    remote::{self, CacheType},
8    Result,
9};
10
11use super::{
12    common::{self, get_user},
13    gist, merge_request,
14    project::{ProjectListBodyArgs, ProjectListCliArgs},
15};
16
17pub fn execute(
18    options: MyOptions,
19    config: Arc<dyn ConfigProperties>,
20    domain: String,
21    path: String,
22) -> Result<()> {
23    match options {
24        MyOptions::MergeRequest(cli_args) => {
25            merge_request::list_merge_requests(domain, path, config, cli_args)
26        }
27        MyOptions::Project(cli_args) => {
28            let user = get_user(&domain, &path, &config, &cli_args.list_args)?;
29            let remote = remote::get_project(
30                domain,
31                path,
32                config,
33                Some(&cli_args.list_args.get_args.cache_args),
34                CacheType::File,
35            )?;
36            let from_to_args = remote::validate_from_to_page(&cli_args.list_args)?;
37            let body_args = ProjectListBodyArgs::builder()
38                .from_to_page(from_to_args)
39                .user(Some(user))
40                .stars(cli_args.stars)
41                .build()?;
42            if cli_args.list_args.num_pages {
43                return common::num_project_pages(remote, body_args, std::io::stdout());
44            }
45            if cli_args.list_args.num_resources {
46                return common::num_project_resources(remote, body_args, std::io::stdout());
47            }
48            list_user_projects(remote, body_args, cli_args, std::io::stdout())
49        }
50        MyOptions::Gist(cli_args) => {
51            let remote = remote::get_gist(
52                domain,
53                path,
54                config,
55                Some(&cli_args.list_args.get_args.cache_args),
56                CacheType::File,
57            )?;
58            if cli_args.list_args.num_pages {
59                return common::num_user_gists(remote, std::io::stdout());
60            }
61            if cli_args.list_args.num_resources {
62                return common::num_user_gist_resources(remote, std::io::stdout());
63            }
64            let from_to_args = remote::validate_from_to_page(&cli_args.list_args)?;
65            let body_args = gist::GistListBodyArgs::builder()
66                .body_args(from_to_args)
67                .build()?;
68            gist::list_user_gists(remote, body_args, cli_args, std::io::stdout())
69        }
70    }
71}
72
73fn list_user_projects<W: Write>(
74    remote: Arc<dyn RemoteProject>,
75    body_args: ProjectListBodyArgs,
76    cli_args: ProjectListCliArgs,
77    writer: W,
78) -> Result<()> {
79    common::list_user_projects(remote, body_args, cli_args, writer)
80}
81
82#[cfg(test)]
83mod tests {
84
85    use crate::cmds::project::{Member, Project, ProjectListCliArgs};
86
87    use self::remote::ListRemoteCliArgs;
88
89    use super::*;
90
91    struct MockGitlab {
92        projects: Vec<Project>,
93    }
94
95    impl MockGitlab {
96        fn new(projects: Vec<Project>) -> Self {
97            MockGitlab { projects }
98        }
99    }
100
101    impl RemoteProject for MockGitlab {
102        fn list(&self, _args: ProjectListBodyArgs) -> Result<Vec<Project>> {
103            Ok(self.projects.clone())
104        }
105
106        fn get_project_data(
107            &self,
108            _id: Option<i64>,
109            _path: Option<&str>,
110        ) -> Result<crate::io::CmdInfo> {
111            todo!()
112        }
113
114        fn get_project_members(&self) -> Result<crate::io::CmdInfo> {
115            todo!()
116        }
117
118        fn get_url(&self, _option: crate::cli::browse::BrowseOptions) -> String {
119            todo!()
120        }
121
122        fn num_pages(&self, _args: ProjectListBodyArgs) -> Result<Option<u32>> {
123            todo!()
124        }
125
126        fn num_resources(
127            &self,
128            _args: ProjectListBodyArgs,
129        ) -> Result<Option<crate::api_traits::NumberDeltaErr>> {
130            todo!()
131        }
132    }
133
134    #[test]
135    fn test_list_current_user_projects() {
136        let projects = vec![Project::new(1, "main"), Project::new(2, "dev")];
137        let user_id = 1;
138        let cli_args = ProjectListCliArgs::builder()
139            .list_args(ListRemoteCliArgs::builder().build().unwrap())
140            .build()
141            .unwrap();
142        let body_args = ProjectListBodyArgs::builder()
143            .from_to_page(None)
144            .user(Some(
145                Member::builder()
146                    .id(user_id)
147                    .name("jordi".to_string())
148                    .username("jordilin".to_string())
149                    .build()
150                    .unwrap(),
151            ))
152            .build()
153            .unwrap();
154        let mut buffer = Vec::new();
155        assert!(list_user_projects(
156            Arc::new(MockGitlab::new(projects)),
157            body_args,
158            cli_args,
159            &mut buffer,
160        )
161        .is_ok());
162        assert_eq!(
163            "ID|Default Branch|URL|Created at\n1|main||\n2|dev||\n",
164            String::from_utf8(buffer).unwrap()
165        );
166    }
167}