lenso-service 0.1.24

Public contracts for Lenso Providers and Autonomous Services.
Documentation
mod config;
mod deployment;
mod edge;
mod eligibility;
mod policy;
mod promotion;
mod release;
mod resilience;
mod rollout;
mod trust;

use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;

pub use config::*;
pub use deployment::*;
pub use edge::*;
pub use eligibility::*;
pub use policy::*;
pub use promotion::*;
pub use release::*;
pub use resilience::*;
pub use rollout::*;
pub use trust::*;

#[derive(
    Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, JsonSchema, ToSchema,
)]
#[serde(rename_all = "snake_case")]
pub enum DeliveryDecision {
    Passed,
    Advisory,
    Blocked,
}

#[derive(
    Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, JsonSchema, ToSchema,
)]
#[serde(rename_all = "snake_case")]
pub enum DeliveryIssueCode {
    ReleaseInputInvalid,
    MutableArtifactReference,
    MissingSbom,
    MissingProvenance,
    ProvenanceSubjectMismatch,
    SignatureMissing,
    SignatureInvalid,
    SignerUntrusted,
    SignerRevoked,
    ReleaseTampered,
    ConfigContractMismatch,
    PlaintextSecretDetected,
    SecretReferenceUnresolved,
    StaleInput,
    ConcurrentMutation,
    PolicyEvidenceMissing,
    PolicyRuleBlocked,
    ContractIncompatible,
    MigrationUnsafe,
    WorkflowIncompatible,
    RollbackUnsafe,
    EdgeOperationUnknown,
    EdgePathConflict,
    EdgeExposureUnsafe,
    DeploymentInputInvalid,
    MigrationIncomplete,
    ObservationStale,
    ApprovalRequired,
    ApprovalInvalid,
    ReliabilityEvidenceMissing,
    CanaryBreach,
    RollbackIncomplete,
    CoordinationUnavailable,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, ToSchema)]
#[serde(rename_all = "camelCase")]
pub struct DeliveryIssue {
    pub code: DeliveryIssueCode,
    pub message: String,
    #[serde(default)]
    pub evidence_references: Vec<String>,
    pub remediation: String,
    #[serde(default)]
    pub next_actions: Vec<String>,
}

#[allow(clippy::struct_excessive_bools)]
#[derive(
    Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, ToSchema,
)]
#[serde(rename_all = "camelCase")]
pub struct DeliveryEffects {
    pub mutates_environment: bool,
    pub mutates_configuration: bool,
    pub mutates_gateway: bool,
    pub mutates_deployment: bool,
    pub appends_ledger: bool,
}

pub(crate) fn issue(
    code: DeliveryIssueCode,
    message: impl Into<String>,
    remediation: impl Into<String>,
    next_action: impl Into<String>,
) -> DeliveryIssue {
    DeliveryIssue {
        code,
        message: message.into(),
        evidence_references: Vec::new(),
        remediation: remediation.into(),
        next_actions: vec![next_action.into()],
    }
}

pub(crate) fn valid_sha256_digest(value: &str) -> bool {
    value.strip_prefix("sha256:").is_some_and(|digest| {
        digest.len() == 64
            && digest
                .bytes()
                .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte))
    })
}