use alloc::{string::String, vec::Vec};
use core::hash::BuildHasherDefault;
use fnv::FnvHasher;
use indexmap::IndexMap;
#[cfg(feature = "schemars")]
use schemars::JsonSchema;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[cfg(feature = "time")]
use time::OffsetDateTime;
use crate::{
ArtifactRef, AttestationId, AttestationRef, BranchRef, BuildLogRef, BuildRef, CommitRef,
ComponentRef, RegistryRef, RepoRef, SbomRef, ScanRef, SignatureRef, SigningKeyRef,
StatementRef, StoreRef, TenantCtx, VersionRef,
};
pub type SupplyHasher = BuildHasherDefault<FnvHasher>;
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct BuildPlan {
pub build_id: BuildRef,
pub component: ComponentRef,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub branch: Option<BranchRef>,
pub source_repo: RepoRef,
pub commit: String,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub commit_ref: Option<CommitRef>,
pub language: String,
pub entrypoint: String,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "IndexMap::is_empty")
)]
#[cfg_attr(
feature = "schemars",
schemars(
with = "alloc::collections::BTreeMap<String, String>",
description = "Environment variables"
)
)]
pub env: IndexMap<String, String, SupplyHasher>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Vec::is_empty")
)]
pub outputs: Vec<ArtifactRef>,
#[cfg_attr(feature = "serde", serde(default))]
pub metadata: Value,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub enum BuildStatusKind {
Pending,
Running,
Succeeded,
Failed,
Cancelled,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct BuildStatus {
pub build_id: BuildRef,
pub status: BuildStatusKind,
#[cfg_attr(
all(feature = "schemars", feature = "time"),
schemars(with = "Option<String>", description = "RFC3339 timestamp in UTC")
)]
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
#[cfg(feature = "time")]
pub started_at_utc: Option<OffsetDateTime>,
#[cfg_attr(
all(feature = "schemars", feature = "time"),
schemars(with = "Option<String>", description = "RFC3339 timestamp in UTC")
)]
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
#[cfg(feature = "time")]
pub finished_at_utc: Option<OffsetDateTime>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Vec::is_empty")
)]
pub artifacts: Vec<ArtifactRef>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub logs_ref: Option<String>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Vec::is_empty")
)]
pub log_refs: Vec<BuildLogRef>,
#[cfg_attr(feature = "serde", serde(default))]
pub metadata: Value,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub enum ScanKind {
Source,
Dependencies,
Artifact,
Custom(String),
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct ScanRequest {
pub scan_id: ScanRef,
pub component: ComponentRef,
pub kind: ScanKind,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub commit_ref: Option<CommitRef>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub artifact: Option<ArtifactRef>,
#[cfg_attr(feature = "serde", serde(default))]
pub metadata: Value,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub enum ScanStatusKind {
Pending,
Running,
Succeeded,
Failed,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct ScanResult {
pub scan_id: ScanRef,
pub component: ComponentRef,
pub kind: ScanKind,
pub status: ScanStatusKind,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub sbom: Option<SbomRef>,
#[cfg_attr(feature = "serde", serde(default))]
pub findings: Value,
#[cfg_attr(
all(feature = "schemars", feature = "time"),
schemars(with = "Option<String>", description = "RFC3339 timestamp in UTC")
)]
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
#[cfg(feature = "time")]
pub started_at_utc: Option<OffsetDateTime>,
#[cfg_attr(
all(feature = "schemars", feature = "time"),
schemars(with = "Option<String>", description = "RFC3339 timestamp in UTC")
)]
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
#[cfg(feature = "time")]
pub finished_at_utc: Option<OffsetDateTime>,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct SignRequest {
pub signing_key: SigningKeyRef,
pub artifact: ArtifactRef,
#[cfg_attr(feature = "serde", serde(default))]
pub payload: Value,
#[cfg_attr(feature = "serde", serde(default))]
pub metadata: Value,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct VerifyRequest {
pub signature: SignatureRef,
pub artifact: ArtifactRef,
#[cfg_attr(feature = "serde", serde(default))]
pub metadata: Value,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct VerifyResult {
pub signature: SignatureRef,
pub valid: bool,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub message: Option<String>,
#[cfg_attr(feature = "serde", serde(default))]
pub metadata: Value,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub enum PredicateType {
Slsa,
Vulnerability,
Custom(String),
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct AttestationStatement {
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub attestation_id: Option<AttestationId>,
pub attestation: AttestationRef,
pub predicate_type: PredicateType,
pub statement: StatementRef,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub registry: Option<RegistryRef>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub store: Option<StoreRef>,
#[cfg_attr(feature = "serde", serde(default))]
pub metadata: Value,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct MetadataRecord {
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub version: Option<VersionRef>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub namespace: Option<String>,
pub key: String,
pub value: Value,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct RepoContext {
pub tenant: TenantCtx,
pub repo: RepoRef,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct StoreContext {
pub tenant: TenantCtx,
pub store: StoreRef,
}