80f9e01
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<ProbeInfo, ImportError> {
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()
}),
})
}