Skip to main content

a3s_flow/workflow_dsl/
version.rs

1use semver::Version;
2
3use super::{WorkflowDslError, TESTED_WORKFLOW_DSL_VERSION};
4
5/// Compatibility of an imported workflow DSL with the version exercised by
6/// this release of A3S Flow.
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8#[non_exhaustive]
9pub enum WorkflowDslCompatibility {
10    /// The imported DSL can be consumed directly.
11    Compatible,
12    /// The imported DSL is from an older minor and should surface a warning.
13    CompatibleWithWarnings,
14    /// A newer DSL or different major requires an explicit host decision.
15    RequiresConfirmation,
16}
17
18pub(super) fn classify_dsl_version(
19    imported: &str,
20) -> Result<WorkflowDslCompatibility, WorkflowDslError> {
21    let current = Version::parse(TESTED_WORKFLOW_DSL_VERSION).map_err(|error| {
22        WorkflowDslError::InvalidDocument {
23            message: format!(
24                "A3S Flow tested workflow DSL version {TESTED_WORKFLOW_DSL_VERSION:?} is invalid: {error}"
25            ),
26        }
27    })?;
28    let imported = Version::parse(imported).map_err(|error| WorkflowDslError::InvalidDocument {
29        message: format!("workflow DSL version {imported:?} is invalid: {error}"),
30    })?;
31
32    if imported > current || imported.major < current.major {
33        return Ok(WorkflowDslCompatibility::RequiresConfirmation);
34    }
35    if imported.minor < current.minor {
36        return Ok(WorkflowDslCompatibility::CompatibleWithWarnings);
37    }
38    Ok(WorkflowDslCompatibility::Compatible)
39}