use crate::core::NormalizedPath;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum LookupResult {
Hit {
artifact: ArtifactData,
},
Miss,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum StoreResult {
Stored,
AlreadyExists,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ArtifactData {
pub outputs: Vec<ArtifactOutput>,
pub stdout: Arc<Vec<u8>>,
pub stderr: Arc<Vec<u8>>,
pub exit_code: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ArtifactPayload {
Bytes(Arc<Vec<u8>>),
Path(NormalizedPath),
}
impl ArtifactPayload {
#[must_use]
pub fn size_bytes(&self) -> u64 {
match self {
Self::Bytes(b) => b.len() as u64,
Self::Path(p) => std::fs::metadata(p.as_path()).map(|m| m.len()).unwrap_or(0),
}
}
#[must_use]
pub fn as_bytes(&self) -> Option<&Arc<Vec<u8>>> {
match self {
Self::Bytes(b) => Some(b),
Self::Path(_) => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ArtifactOutput {
pub name: String,
pub payload: ArtifactPayload,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RustArtifactInfo {
pub cache_key: String,
pub output_names: Vec<String>,
pub payload_count: usize,
}