use super::*;
use std::collections::HashSet;
const REVIEW_STATUSES: &[AssetStatus] = &[
AssetStatus::AdFeedback,
AssetStatus::FeedbackAddressed,
AssetStatus::SubmitForReview,
AssetStatus::_ForReview,
AssetStatus::QcApproved,
AssetStatus::AdApproved,
AssetStatus::PendingFeedback,
AssetStatus::ClientApproved,
];
#[derive(Debug, Clone, Copy, PartialEq, Hash)]
pub enum StatusAction {
BigBang,
Genesis,
Toggle(AssetStatus),
BriefCreated,
Qc(u16),
Uploaded,
FeedbackAddressed,
FeedbackApproved,
AdFeedback,
AdApproved,
ClientFeedback,
ClientApproved,
Published,
Delivered,
}
impl StatusAction {
fn reset_review(current: &[AssetStatus]) -> HashSet<AssetStatus> {
let review_statuses: HashSet<AssetStatus> = REVIEW_STATUSES.to_vec().into_iter().collect();
let current: HashSet<AssetStatus> = current.to_vec().into_iter().collect();
current
.difference(&review_statuses)
.map(|s| s.clone())
.collect()
}
fn client_feedback(&self, current: &[AssetStatus]) -> HashSet<AssetStatus> {
let mut reset_review = Self::reset_review(current);
reset_review.insert(AssetStatus::ClientFeedback);
reset_review
}
fn delivered(&self, current: &[AssetStatus]) -> HashSet<AssetStatus> {
let mut current = target_working_steps_with_extension(
current,
AssetStatus::PendingFeedback,
&[AssetStatus::QcApproved],
);
current.remove(&AssetStatus::ClientFeedback);
current
}
pub fn finish(&self, current: &[AssetStatus]) -> HashSet<AssetStatus> {
match self {
Self::BigBang => HashSet::from([AssetStatus::NoBrief]),
Self::Genesis => unimplemented!(),
Self::Toggle(status) => {
let mut s: HashSet<AssetStatus> = HashSet::from_iter(current.to_vec());
match current.contains(&status) {
true => {
s.remove(status);
}
false => {
s.insert(status.clone());
}
};
s
}
Self::BriefCreated => HashSet::from([AssetStatus::NotStarted]),
Self::Qc(_failed_items) => unimplemented!(),
Self::Uploaded => unimplemented!(),
Self::FeedbackAddressed => {
target_working_steps_with_extension(current, AssetStatus::FeedbackAddressed, &[])
}
Self::FeedbackApproved => target_working_steps_with_extension(
current,
AssetStatus::SubmitForReview,
&[AssetStatus::QcApproved],
),
Self::AdFeedback => target_working_steps_with_extension(
current,
AssetStatus::AdFeedback,
&[AssetStatus::ClientFeedback],
),
Self::AdApproved => target_working_steps_with_extension(
current,
AssetStatus::AdApproved,
&[AssetStatus::QcApproved],
),
Self::ClientApproved => target_working_steps_with_extension(
current,
AssetStatus::ClientApproved,
&[AssetStatus::QcApproved],
),
Self::ClientFeedback => self.client_feedback(current),
Self::Published => unimplemented!(),
Self::Delivered => self.delivered(current),
}
}
pub fn outcome_as_str(&self, current: &[AssetStatus]) -> Vec<String> {
self.finish(current).iter().map(|s| s.into()).collect()
}
}
pub const WORKING_STEPS: &[AssetStatus] = &[
AssetStatus::Blocking,
AssetStatus::Model,
AssetStatus::Uv,
AssetStatus::Texture,
AssetStatus::Lod,
AssetStatus::Rig,
];
fn intersect_with_working_steps(statuses: &[AssetStatus]) -> HashSet<AssetStatus> {
from_slice(statuses)
.intersection(&from_slice(WORKING_STEPS))
.map(|s| s.to_owned())
.collect()
}
fn working_steps_and_extend(
statuses: &[AssetStatus],
extension: &[AssetStatus],
) -> HashSet<AssetStatus> {
let mut intersect = intersect_with_working_steps(statuses);
intersect.extend(from_slice(extension));
intersect
}
fn target_working_steps_with_extension(
statuses: &[AssetStatus],
target: AssetStatus,
extension: &[AssetStatus],
) -> HashSet<AssetStatus> {
let mut extended = working_steps_and_extend(statuses, extension);
extended.insert(target);
extended
}
pub fn last_working_step(statuses: &[AssetStatus]) -> Option<AssetStatus> {
for s in WORKING_STEPS.iter().rev() {
if statuses.contains(s) {
return Some(s.clone());
};
}
None
}
fn from_slice(a: &[AssetStatus]) -> HashSet<AssetStatus> {
a.to_vec().into_iter().collect()
}