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