datex_core/datex_values/
slot.rs1use std::fmt;
2
3#[derive(Clone, PartialEq, Eq)]
4pub struct SlotIdentifier {
5 pub index: u16,
6}
7
8
9
10pub mod internal_slot {
11 use super::SlotIdentifier;
12
13 pub const THIS:SlotIdentifier = SlotIdentifier {index: 0xff00};
14 pub const IT:SlotIdentifier = SlotIdentifier {index: 0xff01};
15 pub const PUBLIC:SlotIdentifier = SlotIdentifier {index: 0xff02};
16 pub const ORIGIN:SlotIdentifier = SlotIdentifier {index: 0xff03};
17 pub const ENDPOINT:SlotIdentifier = SlotIdentifier {index: 0xff04};
18 pub const LOCATION:SlotIdentifier = SlotIdentifier {index: 0xff05};
19 pub const META:SlotIdentifier = SlotIdentifier {index: 0xff06};
20 pub const ENV:SlotIdentifier = SlotIdentifier {index: 0xff07};
21 pub const RESULT:SlotIdentifier = SlotIdentifier {index: 0xff08};
22 pub const SUB_RESULT:SlotIdentifier = SlotIdentifier {index: 0xff09};
23 pub const ENTRYPOINT:SlotIdentifier = SlotIdentifier {index: 0xff0a};
24 pub const STD:SlotIdentifier = SlotIdentifier {index: 0xff0b};
25
26 pub const OBJ_WRITE:SlotIdentifier = SlotIdentifier {index: 0xfef0};
27 pub const OBJ_READ:SlotIdentifier = SlotIdentifier {index: 0xfef1};
28 pub const OBJ_EXEC:SlotIdentifier = SlotIdentifier {index: 0xfef2};
29}
30
31
32pub mod internal_slot_address_space {
46 pub const RESERVED:(u16,u16) = (0xff00, 0xffff);
47 pub const RESERVED_OBJECT_SLOTS:(u16,u16) = (0xfef0, 0xfeff);
48
49 pub const SCOPE_VAL_TRANSFER:(u16,u16) = (0xf000, 0xf9ff);
50 pub const OBJECT_SLOTS:(u16,u16) = (0xfa00, 0xfeef);
51 pub const UNASSIGNED:(u16,u16) = (0x0000, 0xefff);
52}
53
54impl Default for SlotIdentifier {
55 fn default() -> Self { SlotIdentifier {index:0} }
56}
57
58impl SlotIdentifier {
59
60 pub fn new(index:u16) -> SlotIdentifier {
61 SlotIdentifier {index}
62 }
63
64 pub fn to_string(&self) -> String {
65 match *self {
66 internal_slot::THIS => {"#this".to_string()},
67 internal_slot::IT => {"#it".to_string()},
68 internal_slot::PUBLIC => {"#public".to_string()},
69 internal_slot::ORIGIN => {"#origin".to_string()},
70 internal_slot::ENDPOINT => {"#endpoint".to_string()},
71 internal_slot::LOCATION => {"#location".to_string()},
72 internal_slot::META => {"#meta".to_string()},
73 internal_slot::ENV => {"#env".to_string()},
74 internal_slot::RESULT => {"#result".to_string()},
75 internal_slot::SUB_RESULT => {"#sub_result".to_string()},
76 internal_slot::ENTRYPOINT => {"#entrypoint".to_string()},
77 internal_slot::STD => {"#std".to_string()},
78
79 internal_slot::OBJ_READ => {"#read".to_string()},
80 internal_slot::OBJ_WRITE => {"#write".to_string()},
81 internal_slot::OBJ_EXEC => {"#exec".to_string()},
82
83 _ => format!("#{:X}", self.index)
84 }
85 }
86
87 pub fn is_reserved(&self) -> bool {
88 self.index >= internal_slot_address_space::RESERVED_OBJECT_SLOTS.0 && self.index <= internal_slot_address_space::RESERVED.1
89 }
90
91 pub fn is_object_slot(&self) -> bool {
92 (self.index >= internal_slot_address_space::OBJECT_SLOTS.0 && self.index <= internal_slot_address_space::OBJECT_SLOTS.1) ||
93 (self.index >= internal_slot_address_space::RESERVED_OBJECT_SLOTS.0 && self.index <= internal_slot_address_space::RESERVED_OBJECT_SLOTS.1)
94 }
95}
96
97impl fmt::Display for SlotIdentifier {
98 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
99 write!(f, "{}", self.to_string())
100 }
101}