use std::collections::BTreeMap;
use schemars::{JsonSchema, Schema, SchemaGenerator, json_schema};
use serde::{Deserialize, Serialize};
use crate::expr::Expr;
use crate::handler::HandlerBinding;
use crate::primitives::{
FeatureId, FlowId, Hash, Identifier, IrVersion, JsonSchemaDocument, ProviderName,
};
use crate::source_map::SourceMapEntry;
use crate::step::StepIR;
use crate::vocab::VerdictPolicy;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct FlowIR {
pub ir_version: IrVersion,
pub flow_id: FlowId,
pub ir_hash: Hash,
pub provider: ProviderRef,
pub required_features: std::collections::BTreeSet<FeatureId>,
pub lockfile_digest: Hash,
pub params: Vec<ParamDecl>,
pub outputs: Vec<OutputDecl>,
#[schemars(length(min = 1))]
pub body: Vec<StepIR>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schemars(length(min = 1))]
pub handlers: Option<Vec<HandlerBinding>>,
pub verdict_policy: VerdictPolicy,
pub source_map: Vec<SourceMapEntry>,
#[schemars(schema_with = "subflows_schema")]
pub subflows: BTreeMap<FlowId, FlowRef>,
}
fn subflows_schema(generator: &mut SchemaGenerator) -> Schema {
json_schema!({
"type": "object",
"propertyNames": { "pattern": "^[A-Za-z_][A-Za-z0-9_.-]*$" },
"additionalProperties": generator.subschema_for::<FlowRef>()
})
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[schemars(inline)]
pub struct ProviderRef {
pub name: ProviderName,
#[schemars(length(min = 1))]
pub version: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ParamDecl {
pub name: Identifier,
pub schema: JsonSchemaDocument,
pub required: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct OutputDecl {
pub name: Identifier,
pub schema: JsonSchemaDocument,
pub from: Expr,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct FlowRef {
pub flow_id: FlowId,
pub ir_hash: Hash,
}