use serde::Serialize;
use super::partition::StatusClass;
use crate::backlog_order::OverrideReason;
#[derive(Debug, Clone, PartialEq)]
pub(crate) enum ReasonKind {
Eligibility {
status: Option<String>,
class: StatusClass,
},
BlockedBy { items: Vec<String> },
Blocking { items: Vec<String> },
Score {
base: f64,
value_dim: f64,
risk_dim: f64,
leverage: f64,
optionality: f64,
total: f64,
},
EvictedEdge {
from: String,
to: String,
reason: OverrideReason,
},
CycleDegraded { nodes: Vec<String> },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum Actionability {
Actionable,
Blocked,
}
impl Actionability {
pub(crate) fn badge(self) -> &'static str {
match self {
Actionability::Actionable => "",
Actionability::Blocked => "BLOCKED",
}
}
pub(crate) fn token(self) -> &'static str {
match self {
Actionability::Actionable => "actionable",
Actionability::Blocked => "blocked",
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct SurveyRow {
pub(crate) id: String,
pub(crate) title: String,
pub(crate) kind: String,
pub(crate) status: String,
pub(crate) act: Actionability,
pub(crate) score: f64,
pub(crate) blockers: Vec<String>,
pub(crate) reasons: Vec<ReasonKind>,
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct NextRow {
pub(crate) id: String,
pub(crate) title: String,
pub(crate) kind: String,
pub(crate) status: String,
pub(crate) act: Actionability,
pub(crate) score: f64,
pub(crate) reasons: Vec<ReasonKind>,
pub(crate) blockers: Vec<String>,
pub(crate) blocking: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct BlockersView {
pub(crate) id: String,
pub(crate) transitive: bool,
pub(crate) blocked_by: Vec<String>,
pub(crate) blocking: Vec<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct ActionabilityBlock {
pub(crate) eligible: bool,
pub(crate) actionable: bool,
pub(crate) blockers: Vec<String>,
pub(crate) blocking: Vec<String>,
pub(crate) score: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct Explanation {
pub(crate) id: String,
pub(crate) eligibility: ReasonKind,
pub(crate) blocker_chain: Vec<ReasonKind>,
pub(crate) evictions: Vec<ReasonKind>,
pub(crate) score: ReasonKind,
}
#[derive(Debug, Clone, Serialize)]
pub(crate) struct ActionabilityNode {
pub(crate) id: String,
pub(crate) title: String,
pub(crate) kind: String,
pub(crate) status: String,
pub(crate) actionability: String,
pub(crate) score: f64,
pub(crate) rank: u32,
pub(crate) blockers: Vec<String>,
}
#[derive(Debug, Clone, Serialize)]
pub(crate) struct ActionabilityEdge {
pub(crate) source: String,
pub(crate) target: String,
pub(crate) kind: String,
}
#[derive(Debug, Clone, Serialize)]
pub(crate) struct ActionabilityView {
pub(crate) kind: String,
pub(crate) policy_version: String,
pub(crate) nodes: Vec<ActionabilityNode>,
pub(crate) edges: Vec<ActionabilityEdge>,
}