use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum LiveGate {
FeatureEnabled,
AccountAllowlisted,
LiveScopeGranted,
PreviewUnexpired,
ApprovalRecord,
IdempotencyKey,
RiskPolicyPass,
KillSwitchOpen,
AuditAvailable,
PaperToLiveChecklist,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct LiveTradingGate {
pub feature_enabled: bool,
pub account_allowlisted: bool,
pub live_scope_granted: bool,
pub preview_unexpired: bool,
pub approval_record: bool,
pub idempotency_key: bool,
pub risk_policy_pass: bool,
pub kill_switch_open: bool,
pub audit_available: bool,
pub paper_to_live_checklist: bool,
}
impl LiveTradingGate {
#[must_use]
pub const fn all_closed() -> Self {
Self {
feature_enabled: false,
account_allowlisted: false,
live_scope_granted: false,
preview_unexpired: false,
approval_record: false,
idempotency_key: false,
risk_policy_pass: false,
kill_switch_open: false,
audit_available: false,
paper_to_live_checklist: false,
}
}
#[must_use]
pub const fn is_open(&self) -> bool {
self.feature_enabled
&& self.account_allowlisted
&& self.live_scope_granted
&& self.preview_unexpired
&& self.approval_record
&& self.idempotency_key
&& self.risk_policy_pass
&& self.kill_switch_open
&& self.audit_available
&& self.paper_to_live_checklist
}
#[must_use]
pub fn missing_gates(&self) -> Vec<LiveGate> {
let mut missing = Vec::new();
push_if_missing(&mut missing, self.feature_enabled, LiveGate::FeatureEnabled);
push_if_missing(
&mut missing,
self.account_allowlisted,
LiveGate::AccountAllowlisted,
);
push_if_missing(
&mut missing,
self.live_scope_granted,
LiveGate::LiveScopeGranted,
);
push_if_missing(
&mut missing,
self.preview_unexpired,
LiveGate::PreviewUnexpired,
);
push_if_missing(&mut missing, self.approval_record, LiveGate::ApprovalRecord);
push_if_missing(&mut missing, self.idempotency_key, LiveGate::IdempotencyKey);
push_if_missing(
&mut missing,
self.risk_policy_pass,
LiveGate::RiskPolicyPass,
);
push_if_missing(
&mut missing,
self.kill_switch_open,
LiveGate::KillSwitchOpen,
);
push_if_missing(&mut missing, self.audit_available, LiveGate::AuditAvailable);
push_if_missing(
&mut missing,
self.paper_to_live_checklist,
LiveGate::PaperToLiveChecklist,
);
missing
}
}
fn push_if_missing(missing: &mut Vec<LiveGate>, passed: bool, gate: LiveGate) {
if !passed {
missing.push(gate);
}
}