use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)]
pub struct Manifest {
pub name: String,
pub version: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub author: String,
pub isa: Option<String>,
pub entry: Option<String>,
#[serde(rename = "testEntry")]
pub test_entry: Option<String>,
pub execution: Option<serde_json::Value>,
pub dependencies: Option<serde_json::Value>,
pub resolution: Option<serde_json::Value>,
pub toolchain: Option<serde_json::Value>,
pub targets: Option<serde_json::Value>,
pub keywords: Option<Vec<String>>,
pub license: Option<String>,
pub repository: Option<String>,
pub homepage: Option<String>,
#[serde(rename = "standardStatus", default, skip_serializing_if = "Option::is_none")]
pub standard_status: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub authority: Option<String>,
#[serde(rename = "payloadHash", default)]
pub payload_hash: String,
pub checksums: Option<ManifestChecksums>,
#[serde(rename = "payloadSize", default)]
pub payload_size: u64,
}
impl Manifest {
pub fn effective_payload_hash(&self) -> &str {
if let Some(ref c) = self.checksums {
if !c.payload.is_empty() {
return c.payload.trim_start_matches("sha256:");
}
}
self.payload_hash.trim_start_matches("sha256-").trim_start_matches("sha256:")
}
pub fn effective_entry(&self) -> Option<String> {
if let Some(ref exec) = self.execution {
if let Some(v) = exec.get("entry").and_then(|x| x.as_str()) {
let t = v.trim();
if !t.is_empty() {
return Some(t.to_string());
}
}
}
self.entry
.as_ref()
.map(|s| s.trim().to_string())
.filter(|s| !s.is_empty())
}
pub fn effective_test_entry(&self) -> Option<String> {
if let Some(ref exec) = self.execution {
if let Some(v) = exec.get("testEntry").and_then(|x| x.as_str()) {
let t = v.trim();
if !t.is_empty() {
return Some(t.to_string());
}
}
}
self.test_entry
.as_ref()
.map(|s| s.trim().to_string())
.filter(|s| !s.is_empty())
}
}
#[derive(Debug, Deserialize, Serialize)]
pub struct ManifestChecksums {
#[serde(default)]
pub payload: String,
#[serde(default)]
pub archive: String,
}
#[derive(Debug, Deserialize, Clone)]
pub struct RegistryOrgSummary {
pub slug: String,
#[serde(rename = "displayName")]
pub display_name: String,
}
#[derive(Debug, Deserialize)]
pub struct RegistryPackage {
pub id: u32,
pub name: String,
pub slug: String,
pub description: String,
#[serde(rename = "shortDescription")]
pub short_description: Option<String>,
pub author: String,
pub keywords: Option<Vec<String>>,
pub license: Option<String>,
#[serde(rename = "repositoryUrl")]
pub repository_url: Option<String>,
#[serde(rename = "homepageUrl")]
pub homepage_url: Option<String>,
#[serde(rename = "latestVersion")]
pub latest_version: Option<String>,
#[serde(rename = "totalDownloads", default)]
pub total_downloads: u64,
#[serde(rename = "weeklyDownloads", default)]
pub weekly_downloads: u64,
#[serde(default)]
pub org: Option<RegistryOrgSummary>,
pub versions: Vec<RegistryVersion>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct RegistryVersion {
pub version: String,
#[serde(rename = "xsilUrl")]
pub xsil_url: String,
pub checksum: Option<String>,
#[serde(rename = "checksumPayload")]
pub checksum_payload: Option<String>,
pub isa: Option<String>,
pub toolchain: Option<String>,
pub targets: Option<String>,
pub size: Option<u64>,
#[serde(rename = "downloadCount", default)]
pub download_count: u64,
#[serde(rename = "isYanked", default)]
pub is_yanked: bool,
#[serde(rename = "yankReason")]
pub yank_reason: Option<String>,
pub changelog: Option<String>,
#[serde(rename = "publishedAt")]
pub published_at: Option<String>,
pub execution: Option<String>,
pub dependencies: Option<String>,
#[serde(rename = "resolutionMode")]
pub resolution_mode: Option<String>,
#[serde(rename = "readinessLevel", default)]
pub readiness_level: Option<u8>,
#[serde(default)]
pub capabilities: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct UserProfile {
pub id: u32,
pub username: String,
pub email: String,
pub bio: Option<String>,
#[serde(rename = "avatarUrl")]
pub avatar_url: Option<String>,
#[serde(rename = "createdAt")]
pub created_at: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct ResolvedToolArtifact {
pub name: String,
pub version: String,
pub platform: String,
pub sha256: String,
pub url: String,
}
#[derive(Debug, Deserialize)]
pub struct MissingToolArtifact {
pub name: String,
pub version: String,
pub platform: String,
pub sha256: String,
}
#[derive(Debug, Deserialize)]
pub struct ResolveArtifactsResponse {
pub resolved: Vec<ResolvedToolArtifact>,
pub missing: Vec<MissingToolArtifact>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct InstalledExtension {
pub name: String,
pub version: String,
pub installed_at: String,
pub path: String,
}