limnus_system_state/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/swamp/limnus
 * Licensed under the MIT License. See LICENSE in the project root for license information.
 */
use limnus_local_resource::{LocalResource, LocalResourceStorage};
use limnus_message::{Message, MessageStorage, Messages};
use limnus_resource::{Resource, ResourceStorage};

#[derive(Debug, Default)]
pub struct State {
    resources: ResourceStorage,
    local_resources: LocalResourceStorage,
    messages: MessageStorage,
}

impl State {
    #[must_use]
    pub fn new() -> Self {
        Self {
            resources: ResourceStorage::new(),
            messages: MessageStorage::new(),
            local_resources: LocalResourceStorage::new(),
        }
    }

    #[must_use]
    pub const fn messages(&self) -> &MessageStorage {
        &self.messages
    }

    pub fn messages_mut(&mut self) -> &mut MessageStorage {
        &mut self.messages
    }

    #[must_use]
    pub const fn resources(&self) -> &ResourceStorage {
        &self.resources
    }

    #[must_use]
    pub fn resources_mut(&mut self) -> &mut ResourceStorage {
        &mut self.resources
    }

    #[must_use]
    pub fn local_resources_mut(&mut self) -> &mut LocalResourceStorage {
        &mut self.local_resources
    }

    #[must_use]
    pub fn local_resources(&self) -> &LocalResourceStorage {
        &self.local_resources
    }

    #[inline]
    #[must_use]
    pub fn resource<R: Resource>(&self) -> &R {
        self.resources.fetch::<R>()
    }

    #[inline]
    pub fn resource_mut<R: Resource>(&mut self) -> &mut R {
        self.resources.fetch_mut::<R>()
    }

    #[inline]
    #[must_use]
    pub fn local_resource<R: LocalResource>(&self) -> &R {
        self.local_resources.fetch::<R>()
    }

    #[inline]
    pub fn local_resource_mut<R: LocalResource>(&mut self) -> &mut R {
        self.local_resources.fetch_mut::<R>()
    }

    /// # Panics
    pub fn message_mut<M: Message>(&mut self) -> &mut Messages<M> {
        self.messages.get_mut::<M>().expect("Failed to get message")
    }

    /// # Panics
    pub fn message<M: Message>(&mut self) -> &Messages<M> {
        self.messages.get::<M>().expect("Failed to get message")
    }
}