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}