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
87
88
89
90
91
92
93
use stdweb::{InstanceOf, Reference, ReferenceType, Value};
use {
constants::StructureType,
traits::{FromExpectedType, IntoExpectedType, TryFrom, TryInto},
ConversionError,
};
use super::*;
pub enum Structure {
Container(StructureContainer),
Controller(StructureController),
Extension(StructureExtension),
Extractor(StructureExtractor),
KeeperLair(StructureKeeperLair),
Lab(StructureLab),
Link(StructureLink),
Nuker(StructureNuker),
Observer(StructureObserver),
PowerBank(StructurePowerBank),
PowerSpawn(StructurePowerSpawn),
Portal(StructurePortal),
Rampart(StructureRampart),
Road(StructureRoad),
Spawn(StructureSpawn),
Storage(StructureStorage),
Terminal(StructureTerminal),
Tower(StructureTower),
Wall(StructureWall),
}
impl AsRef<Reference> for Structure {
fn as_ref(&self) -> &Reference {
match_structure_variants!(self, v => v.as_ref())
}
}
impl From<Structure> for Reference {
fn from(wrapper: Structure) -> Reference {
match_structure_variants!(wrapper, v => v.0)
}
}
impl FromExpectedType<Reference> for Structure {
fn from_expected_type(reference: Reference) -> Result<Self, ConversionError> {
let structure_type = js!(return @{&reference}.structureType;).try_into()?;
let structure = construct_structure_variants!(
structure_type => reference.into_expected_type()?
);
Ok(structure)
}
}
impl TryFrom<Reference> for Structure {
type Error = ConversionError;
fn try_from(reference: Reference) -> Result<Self, ConversionError> {
let structure_type = js!(return @{&reference}.structureType;).try_into()?;
let structure = construct_structure_variants!(
structure_type => reference.try_into()?
);
Ok(structure)
}
}
impl InstanceOf for Structure {
fn instance_of(reference: &Reference) -> bool {
js_unwrap!(@{reference} instanceof Structure)
}
}
impl TryFrom<Value> for Structure {
type Error = ConversionError;
fn try_from(v: Value) -> Result<Structure, Self::Error> {
Reference::try_from(v).and_then(Self::try_from)
}
}
impl ReferenceType for Structure {
unsafe fn from_reference_unchecked(reference: Reference) -> Self {
let structure_type = js_unwrap!(@{&reference}.structureType);
construct_structure_variants!(
structure_type => ReferenceType::from_reference_unchecked(reference)
)
}
}