use crate::cli::Issue2Work; use crate::config::Config; use crate::openproject::client::Client; use gitlab::{ GitlabBuilder, Issue, Project}; use gitlab::api::{issues, AsyncQuery, projects}; use url::Url; use crate::error::GeneralError; use crate::gitlab::issue::IssueBundle; #[derive(Debug)] struct IssueInfo { project: String, iid: u64, } pub(crate) async fn issue2work(config: Config, args: &Issue2Work) -> Result<(), GeneralError> { let url = Url::parse(&*args.issue_url) .expect("issue_url is not valid"); let data = extract_issue_info(&url).unwrap(); let client = GitlabBuilder::new("gitlab.com", config.gitlab.token).build_async().await?; let endpoint = issues::ProjectIssues::builder() .iid(data.iid) .project(String::from(data.project)) .build() .unwrap() ; let issues: Vec = endpoint.query_async(&client).await.unwrap(); let issue = issues.first().unwrap(); let project_endpoint = projects::Project::builder() .project(issue.project_id.value()) .build() .unwrap(); let project: Project = project_endpoint.query_async(&client).await.unwrap(); let issue_bundle = IssueBundle::new(&issue, &project); let open_project_client = Client::from_config(&config.openproject); let work_package = open_project_client.create_work_package(&(&issue_bundle).into(), &args.project_id).await?; println!("new work package created: {:?}, edit at {}/projects/{}/work_packages/{}", work_package.subject, config.openproject.base_url, args.project_id, work_package.id); Ok(()) } fn extract_issue_info(url: &Url) -> Option { let parts = url.path_segments().expect("Could not parse path segment of given url"); let mut project_url: Vec = Vec::with_capacity(3); let mut iid: Option = None; let mut project_found = false; for el in parts { if el == "-" { project_found = true; continue; } if el == "issues" { continue } if !project_found { project_url.push(String::from(el)); } else { // must be the id iid = Some(String::from(el)); break; } } Some(IssueInfo { project: project_url.join("/"), iid: iid.expect("iid of the issue not found") .parse().expect("could not transform issue id to u64") }) }