use canic_contracts::ids::CanisterRole;
use canic_core::role_contract::{ProtocolProfileDigest, RoleCapabilityKey};
use std::{collections::BTreeSet, path::PathBuf, time::Duration};
pub(super) const FLEET_COORDINATOR_ROLE: &str = "fleet_coordinator";
pub(super) const WASM_STORE_ROLE: &str = "wasm_store";
pub(super) const WASM_TARGET: &str = "wasm32-unknown-unknown";
pub struct TimedCanisterArtifactBuildOutput {
pub output: CanisterArtifactBuildOutput,
pub elapsed: Duration,
}
pub struct AppCanisterArtifactBuildOutput {
pub coordinator: TimedCanisterArtifactBuildOutput,
pub store: TimedCanisterArtifactBuildOutput,
pub configured: Vec<ConfiguredCanisterArtifactBuildOutput>,
pub configured_elapsed: Duration,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct CanisterArtifactBuildOptions {
pub cargo_features: BTreeSet<String>,
pub default_features: bool,
pub sidecar_only_candid: bool,
}
impl Default for CanisterArtifactBuildOptions {
fn default() -> Self {
Self {
cargo_features: BTreeSet::new(),
default_features: true,
sidecar_only_candid: false,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(super) enum CanisterArtifactSource {
DeclaredRole,
FleetCoordinator,
Root,
WasmStore,
}
impl CanisterArtifactSource {
#[must_use]
pub(super) fn for_role(role: &str) -> Self {
match role {
FLEET_COORDINATOR_ROLE => Self::FleetCoordinator,
"root" => Self::Root,
WASM_STORE_ROLE => Self::WasmStore,
_ => Self::DeclaredRole,
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct CanisterArtifactBuildSpec {
pub(crate) role: String,
pub(crate) package_name: String,
pub(crate) package_version: String,
pub(crate) canic_version: String,
pub(crate) capabilities:
std::collections::BTreeSet<canic_core::role_contract::RoleCapabilityKey>,
pub(crate) package_manifest_path: PathBuf,
pub(crate) cargo_workspace_root: PathBuf,
pub(crate) artifact_root: PathBuf,
pub(crate) wasm_path: PathBuf,
pub(crate) wasm_gz_path: PathBuf,
pub(crate) did_path: PathBuf,
}
#[derive(Clone, Debug)]
pub struct CanisterArtifactBuildOutput {
pub package_name: String,
pub package_version: String,
pub protocol_release_identity: String,
pub protocol_role: CanisterRole,
pub protocol_capabilities: BTreeSet<RoleCapabilityKey>,
pub artifact_root: PathBuf,
pub wasm_path: PathBuf,
pub wasm_gz_path: PathBuf,
pub did_path: PathBuf,
pub candid_sha256: [u8; 32],
pub protocol_profile_digest: ProtocolProfileDigest,
pub transforms: Vec<ArtifactTransformOutput>,
}
#[derive(Clone, Debug)]
pub struct ConfiguredCanisterArtifactBuildOutput {
pub role: String,
pub output: CanisterArtifactBuildOutput,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ArtifactTransformOutput {
pub transform: ArtifactTransformKind,
pub tool_version: Option<String>,
pub tool_sha256: Option<String>,
pub outcome: ArtifactTransformOutcome,
pub metrics: Option<WasmTransformMetrics>,
}
impl ArtifactTransformOutput {
pub(crate) const fn not_requested(transform: ArtifactTransformKind) -> Self {
Self {
transform,
tool_version: None,
tool_sha256: None,
outcome: ArtifactTransformOutcome::NotRequested,
metrics: None,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ArtifactTransformKind {
Shrink,
CandidMetadata,
Optimize,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ArtifactTransformOutcome {
Applied,
NotRequested,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct WasmTransformMetrics {
pub before: WasmArtifactMetrics,
pub after: WasmArtifactMetrics,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct WasmArtifactMetrics {
pub raw_bytes: u64,
pub gzip_bytes: u64,
pub code_section_bytes: u64,
pub data_section_bytes: u64,
pub defined_functions: u32,
}