use crate::errors::ImportError; use super::{ ImportProvider, ProbeInfo, ProbeRequest, api_base, encode_project_path, get_json, http_client, json_i64, json_string, source_path, }; pub async fn probe(request: ProbeRequest<'_>) -> Result { let client = http_client(request.config)?; let base = api_base(ImportProvider::Gitlab, request.base_url, request.config)?; let (path, fallback_name) = source_path(ImportProvider::Gitlab, request.source)?; let url = format!( "{base}/projects/{}?statistics=true", encode_project_path(&path) ); let value = get_json(&client, &url, ImportProvider::Gitlab, request.token).await?; let clone_url = json_string(&value, &["http_url_to_repo"]).ok_or_else(|| { ImportError::Upstream("source forge did not return a clone url".to_string()) })?; let owner = json_string(&value, &["namespace", "full_path"]) .or_else(|| json_string(&value, &["namespace", "path"])) .unwrap_or_else(|| path.split('/').next().unwrap_or_default().to_string()); let visibility = json_string(&value, &["visibility"]).unwrap_or_default(); let has_token = request.token.is_some_and(|token| !token.trim().is_empty()); Ok(ProbeInfo { provider: ImportProvider::Gitlab, owner, name: json_string(&value, &["name"]) .or_else(|| json_string(&value, &["path"])) .unwrap_or(fallback_name), clone_url, default_branch: json_string(&value, &["default_branch"]).unwrap_or_else(|| "main".into()), is_private: visibility == "private", description: json_string(&value, &["description"]), size_bytes: json_i64(&value, &["statistics", "disk_size_bytes"]), owner_external_id: json_string(&value, &["namespace", "id"]), owner_avatar_url: json_string(&value, &["namespace", "avatar_url"]), credential_username: has_token.then(|| { ImportProvider::Gitlab .default_credential_username() .to_string() }), }) }