Skip to main content

steel_registry/advancement/
criterion.rs

1use steel_utils::Identifier;
2
3pub struct ImpossibleInstance;
4impl CriterionTriggerInstance for ImpossibleInstance {}
5
6pub struct ImpossibleTrigger;
7impl CriterionTrigger<ImpossibleInstance> for ImpossibleTrigger {
8    fn id(&self) -> Identifier {
9        Identifier::vanilla_static("impossible")
10    }
11
12    fn parse_instance(&self, _instance: String) -> ImpossibleInstance {
13        ImpossibleInstance
14    }
15}
16
17pub trait AnyCriterion: Send + Sync {
18    fn id(&self) -> Identifier;
19}
20
21impl<T, G> AnyCriterion for Criterion<T, G>
22where
23    T: CriterionTriggerInstance + 'static,
24    G: CriterionTrigger<T> + 'static,
25{
26    fn id(&self) -> Identifier {
27        self.trigger.id()
28    }
29}
30
31#[expect(dead_code)]
32pub struct Criterion<
33    T: CriterionTriggerInstance + 'static,
34    G: CriterionTrigger<T> + ?Sized + 'static,
35> {
36    trigger: &'static G,
37    instance: Box<T>,
38}
39
40static IMPOSSIBLE_TRIGGER: ImpossibleTrigger = ImpossibleTrigger;
41
42impl<T: CriterionTriggerInstance, G: CriterionTrigger<T> + ?Sized> Criterion<T, G> {
43    pub fn new(trigger: &'static G, instance: T) -> Self {
44        Self {
45            trigger,
46            instance: Box::new(instance),
47        }
48    }
49}
50
51impl Default for Criterion<ImpossibleInstance, ImpossibleTrigger> {
52    fn default() -> Self {
53        Criterion {
54            trigger: &IMPOSSIBLE_TRIGGER,
55            instance: Box::new(ImpossibleInstance),
56        }
57    }
58}
59
60pub trait CriterionTrigger<T>: Send + Sync
61where
62    T: CriterionTriggerInstance,
63{
64    fn id(&self) -> Identifier;
65    fn parse_instance(&self, instance: String) -> T;
66}
67
68pub trait CriterionTriggerInstance: Send + Sync {}