steel_registry/advancement/
criterion.rs1use 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 {}