use std::collections::BTreeMap;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::action::{ActionKind, ActorClass};
use crate::adjustable::Adjustable;
use crate::printer::PrinterState;
use crate::reported::Range;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct SafetyEnvelope {
pub allowed: BTreeMap<Adjustable, Range>,
pub actions: BTreeMap<ActorClass, Vec<ActionKind>>,
pub agent_min_interval_s: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct EffectiveBounds {
pub allowed: BTreeMap<Adjustable, Range>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case", deny_unknown_fields)]
pub enum RejectionReason {
OutOfBounds {
adjustable: Adjustable,
requested: f64,
allowed: Range,
},
ActorMayNotRequest {
actor_class: ActorClass,
action: ActionKind,
},
NoActivePrint,
InvalidFromState {
state: PrinterState,
},
MinIntervalNotElapsed {
interval_s: i64,
since_last_s: i64,
},
UnsupportedAdjustable {
adjustable: Adjustable,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case", deny_unknown_fields)]
pub enum PolicyDecision {
Accepted,
Rejected(RejectionReason),
}