use crate::localization::LocalizedMessage;
use camino::Utf8PathBuf;
use serde::Serialize;
#[cfg(not(kani))]
use std::collections::HashMap;
use thiserror::Error;
use crate::ast::Recipe;
#[cfg(kani)]
#[path = "graph_kani_map.rs"]
mod kani_map;
#[cfg(kani)]
pub use kani_map::IrHashMap;
#[cfg(not(kani))]
pub type IrHashMap<K, V> = HashMap<K, V>;
#[derive(Debug, Default, Clone)]
pub struct BuildGraph {
pub actions: IrHashMap<String, Action>,
pub targets: IrHashMap<Utf8PathBuf, BuildEdge>,
pub default_targets: Vec<Utf8PathBuf>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum DependencyOrder {
#[default]
Parallel,
Serial,
}
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct Action {
pub recipe: Recipe,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub depfile: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deps_format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pool: Option<String>,
pub restat: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct BuildEdge {
pub action_id: String,
pub inputs: Vec<Utf8PathBuf>,
pub implicit_deps: Vec<Utf8PathBuf>,
pub dependency_order: DependencyOrder,
pub explicit_outputs: Vec<Utf8PathBuf>,
pub implicit_outputs: Vec<Utf8PathBuf>,
pub order_only_deps: Vec<Utf8PathBuf>,
pub phony: bool,
pub always: bool,
}
#[derive(Debug, Error)]
pub enum IrGenError {
#[error("{message}")]
RuleNotFound {
target_name: String,
rule_name: String,
message: LocalizedMessage,
},
#[error("{message}")]
MultipleRules {
target_name: String,
rules: Vec<String>,
message: LocalizedMessage,
},
#[error("{message}")]
EmptyRule {
target_name: String,
message: LocalizedMessage,
},
#[error("{message}")]
DuplicateOutput {
outputs: Vec<String>,
message: LocalizedMessage,
},
#[error("{message}")]
CircularDependency {
cycle: Vec<Utf8PathBuf>,
missing_dependencies: Vec<(Utf8PathBuf, Utf8PathBuf)>,
message: LocalizedMessage,
},
#[error("{message}: {source}")]
ActionSerialisation {
#[source]
source: serde_json::Error,
message: LocalizedMessage,
},
#[error("{message}")]
InvalidCommand {
command: String,
snippet: String,
message: LocalizedMessage,
},
}