@quenty/tie 10.19.0 → 10.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/package.json +14 -14
- package/src/Shared/TieDefinition.lua +63 -64
- package/src/Shared/TieImplementation.lua +44 -18
- package/test/modules/Server/Action/Action.lua +3 -3
- package/test/modules/Server/Action/ActionInterface.lua +7 -7
- package/test/modules/Server/Door.lua +3 -3
- package/test/modules/Server/OpenableInterface.lua +8 -8
- package/test/modules/Server/Window.lua +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [10.19.1](https://github.com/Quenty/NevermoreEngine/compare/@quenty/tie@10.19.0...@quenty/tie@10.19.1) (2025-03-21)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @quenty/tie
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
6
14
|
# [10.19.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/tie@10.18.1...@quenty/tie@10.19.0) (2025-02-18)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @quenty/tie
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenty/tie",
|
|
3
|
-
"version": "10.19.
|
|
3
|
+
"version": "10.19.1",
|
|
4
4
|
"description": "Tie allows interfaces to be defined between Lua OOP and Roblox objects.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Roblox",
|
|
@@ -28,29 +28,29 @@
|
|
|
28
28
|
"Quenty"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@quenty/attributeutils": "^14.16.
|
|
31
|
+
"@quenty/attributeutils": "^14.16.1",
|
|
32
32
|
"@quenty/baseobject": "^10.8.0",
|
|
33
|
-
"@quenty/brio": "^14.16.
|
|
34
|
-
"@quenty/collectionserviceutils": "^8.16.
|
|
35
|
-
"@quenty/instanceutils": "^13.16.
|
|
33
|
+
"@quenty/brio": "^14.16.1",
|
|
34
|
+
"@quenty/collectionserviceutils": "^8.16.1",
|
|
35
|
+
"@quenty/instanceutils": "^13.16.1",
|
|
36
36
|
"@quenty/loader": "^10.8.0",
|
|
37
37
|
"@quenty/maid": "^3.4.0",
|
|
38
|
-
"@quenty/rx": "^13.16.
|
|
39
|
-
"@quenty/rxsignal": "^7.16.
|
|
40
|
-
"@quenty/statestack": "^14.17.
|
|
41
|
-
"@quenty/string": "^3.3.
|
|
38
|
+
"@quenty/rx": "^13.16.1",
|
|
39
|
+
"@quenty/rxsignal": "^7.16.1",
|
|
40
|
+
"@quenty/statestack": "^14.17.1",
|
|
41
|
+
"@quenty/string": "^3.3.1",
|
|
42
42
|
"@quenty/symbol": "^3.4.0",
|
|
43
|
-
"@quenty/table": "^3.7.
|
|
43
|
+
"@quenty/table": "^3.7.1",
|
|
44
44
|
"@quenty/tuple": "^1.5.0",
|
|
45
|
-
"@quenty/valuebaseutils": "^13.16.
|
|
46
|
-
"@quenty/valueobject": "^13.16.
|
|
45
|
+
"@quenty/valuebaseutils": "^13.16.1",
|
|
46
|
+
"@quenty/valueobject": "^13.16.1"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@quenty/promise": "^10.10.
|
|
49
|
+
"@quenty/promise": "^10.10.1",
|
|
50
50
|
"@quenty/signal": "^7.10.0"
|
|
51
51
|
},
|
|
52
52
|
"publishConfig": {
|
|
53
53
|
"access": "public"
|
|
54
54
|
},
|
|
55
|
-
"gitHead": "
|
|
55
|
+
"gitHead": "6b7c3e15e60cdb185986207b574e2b5591261e7a"
|
|
56
56
|
}
|
|
@@ -71,9 +71,9 @@ TieDefinition.ClassName = "TieDefinition"
|
|
|
71
71
|
TieDefinition.__index = TieDefinition
|
|
72
72
|
|
|
73
73
|
TieDefinition.Types = Table.readonly({
|
|
74
|
-
METHOD = Symbol.named("method")
|
|
75
|
-
SIGNAL = Symbol.named("signal")
|
|
76
|
-
PROPERTY = Symbol.named("property")
|
|
74
|
+
METHOD = Symbol.named("method"),
|
|
75
|
+
SIGNAL = Symbol.named("signal"),
|
|
76
|
+
PROPERTY = Symbol.named("property"), -- will default to nil
|
|
77
77
|
})
|
|
78
78
|
|
|
79
79
|
TieDefinition.Realms = TieRealms
|
|
@@ -89,7 +89,7 @@ function TieDefinition.new(definitionName, members)
|
|
|
89
89
|
local self = setmetatable({}, TieDefinition)
|
|
90
90
|
|
|
91
91
|
self._definitionName = assert(definitionName, "No definitionName")
|
|
92
|
-
self._validContainerNameSetWeakCache = setmetatable({}, {__mode = "kv"})
|
|
92
|
+
self._validContainerNameSetWeakCache = setmetatable({}, { __mode = "kv" })
|
|
93
93
|
self._memberMap = {}
|
|
94
94
|
self._defaultTieRealm = TieRealms.SHARED
|
|
95
95
|
|
|
@@ -97,15 +97,15 @@ function TieDefinition.new(definitionName, members)
|
|
|
97
97
|
self:_addMembers(members, TieRealms.SHARED)
|
|
98
98
|
|
|
99
99
|
self.Server = setmetatable({
|
|
100
|
-
_defaultTieRealm = TieRealms.SERVER
|
|
100
|
+
_defaultTieRealm = TieRealms.SERVER,
|
|
101
101
|
}, {
|
|
102
|
-
__index = self
|
|
102
|
+
__index = self,
|
|
103
103
|
})
|
|
104
104
|
|
|
105
105
|
self.Client = setmetatable({
|
|
106
|
-
_defaultTieRealm = TieRealms.CLIENT
|
|
106
|
+
_defaultTieRealm = TieRealms.CLIENT,
|
|
107
107
|
}, {
|
|
108
|
-
__index = self
|
|
108
|
+
__index = self,
|
|
109
109
|
})
|
|
110
110
|
|
|
111
111
|
return self
|
|
@@ -114,12 +114,16 @@ end
|
|
|
114
114
|
function TieDefinition:_addMembers(members, realm)
|
|
115
115
|
for memberName, memberTypeOrDefaultValue in pairs(members) do
|
|
116
116
|
if TieRealmUtils.isTieRealm(memberName) then
|
|
117
|
-
|
|
118
117
|
self:_addMembers(memberTypeOrDefaultValue, memberName)
|
|
119
118
|
elseif type(memberName) == "string" then
|
|
120
119
|
self:_addMember(memberName, memberTypeOrDefaultValue, realm)
|
|
121
120
|
else
|
|
122
|
-
error(
|
|
121
|
+
error(
|
|
122
|
+
string.format(
|
|
123
|
+
"[TieDefinition] - Bad memberName %q, expected either string or TieRealm.",
|
|
124
|
+
tostring(memberName)
|
|
125
|
+
)
|
|
126
|
+
)
|
|
123
127
|
end
|
|
124
128
|
end
|
|
125
129
|
end
|
|
@@ -168,20 +172,19 @@ function TieDefinition:GetNewImplClass(tieRealm)
|
|
|
168
172
|
end
|
|
169
173
|
|
|
170
174
|
local IMPL_CLIENT_SET = table.freeze({
|
|
171
|
-
["Configuration"] = true
|
|
175
|
+
["Configuration"] = true,
|
|
172
176
|
})
|
|
173
177
|
|
|
174
178
|
local IMPL_SERVER_SET = table.freeze({
|
|
175
|
-
["Camera"] = true
|
|
179
|
+
["Camera"] = true,
|
|
176
180
|
})
|
|
177
181
|
|
|
178
182
|
local IMPL_SHARED_SET = table.freeze({
|
|
179
|
-
["Camera"] = true
|
|
180
|
-
["Configuration"] = true
|
|
183
|
+
["Camera"] = true,
|
|
184
|
+
["Configuration"] = true,
|
|
181
185
|
})
|
|
182
186
|
|
|
183
187
|
function TieDefinition:GetImplClassSet(tieRealm)
|
|
184
|
-
|
|
185
188
|
if tieRealm == TieRealms.CLIENT then
|
|
186
189
|
-- Shared implements both...
|
|
187
190
|
return IMPL_CLIENT_SET
|
|
@@ -229,7 +232,7 @@ function TieDefinition:ObserveChildrenBrio(adornee: Instance, tieRealm)
|
|
|
229
232
|
return RxInstanceUtils.observeChildrenBrio(adornee):Pipe({
|
|
230
233
|
RxBrioUtils.flatMapBrio(function(child)
|
|
231
234
|
return self:ObserveBrio(child, tieRealm)
|
|
232
|
-
end)
|
|
235
|
+
end),
|
|
233
236
|
})
|
|
234
237
|
end
|
|
235
238
|
|
|
@@ -240,7 +243,7 @@ end
|
|
|
240
243
|
@param tieRealm TieRealm?
|
|
241
244
|
@return Promise<TieInterface>
|
|
242
245
|
]=]
|
|
243
|
-
function TieDefinition:Promise(adornee, tieRealm)
|
|
246
|
+
function TieDefinition:Promise(adornee: Instance, tieRealm)
|
|
244
247
|
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
245
248
|
assert(TieRealmUtils.isTieRealm(tieRealm) or tieRealm == nil, "Bad tieRealm")
|
|
246
249
|
|
|
@@ -249,7 +252,7 @@ function TieDefinition:Promise(adornee, tieRealm)
|
|
|
249
252
|
return Rx.toPromise(self:Observe(adornee, tieRealm):Pipe({
|
|
250
253
|
Rx.where(function(value)
|
|
251
254
|
return value ~= nil
|
|
252
|
-
end)
|
|
255
|
+
end),
|
|
253
256
|
}))
|
|
254
257
|
end
|
|
255
258
|
|
|
@@ -304,7 +307,7 @@ function TieDefinition:ObserveAllTaggedBrio(tagName, tieRealm)
|
|
|
304
307
|
return RxCollectionServiceUtils.observeTaggedBrio(tagName):Pipe({
|
|
305
308
|
RxBrioUtils.flatMapBrio(function(instance)
|
|
306
309
|
return self:ObserveBrio(instance, tieRealm)
|
|
307
|
-
end)
|
|
310
|
+
end),
|
|
308
311
|
})
|
|
309
312
|
end
|
|
310
313
|
|
|
@@ -369,15 +372,14 @@ function TieDefinition:ObserveIsImplemented(adornee: Instance, tieRealm): boolea
|
|
|
369
372
|
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
370
373
|
assert(TieRealmUtils.isTieRealm(tieRealm) or tieRealm == nil, "Bad tieRealm")
|
|
371
374
|
|
|
372
|
-
return self:ObserveLastImplementationBrio(adornee, tieRealm)
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
})
|
|
375
|
+
return self:ObserveLastImplementationBrio(adornee, tieRealm):Pipe({
|
|
376
|
+
RxBrioUtils.map(function(result)
|
|
377
|
+
return result and true or false
|
|
378
|
+
end),
|
|
379
|
+
RxBrioUtils.emitOnDeath(false),
|
|
380
|
+
Rx.defaultsTo(false),
|
|
381
|
+
Rx.distinct(),
|
|
382
|
+
})
|
|
381
383
|
end
|
|
382
384
|
|
|
383
385
|
--[=[
|
|
@@ -392,15 +394,14 @@ function TieDefinition:ObserveIsImplementation(implParent: Instance, tieRealm)
|
|
|
392
394
|
|
|
393
395
|
tieRealm = tieRealm or self._defaultTieRealm
|
|
394
396
|
|
|
395
|
-
return self:_observeImplementation(implParent, tieRealm)
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
})
|
|
397
|
+
return self:_observeImplementation(implParent, tieRealm):Pipe({
|
|
398
|
+
RxBrioUtils.map(function(result)
|
|
399
|
+
return result and true or false
|
|
400
|
+
end),
|
|
401
|
+
RxBrioUtils.emitOnDeath(false),
|
|
402
|
+
Rx.defaultsTo(false),
|
|
403
|
+
Rx.distinct(),
|
|
404
|
+
})
|
|
404
405
|
end
|
|
405
406
|
|
|
406
407
|
--[=[
|
|
@@ -422,13 +423,13 @@ function TieDefinition:ObserveIsImplementedOn(implParent: Instance, adornee: Ins
|
|
|
422
423
|
end):Pipe({
|
|
423
424
|
RxBrioUtils.switchMapBrio(function()
|
|
424
425
|
return self:_observeImplementation(implParent, tieRealm)
|
|
425
|
-
end)
|
|
426
|
+
end),
|
|
426
427
|
RxBrioUtils.map(function(result)
|
|
427
428
|
return result and true or false
|
|
428
|
-
end)
|
|
429
|
-
RxBrioUtils.emitOnDeath(false)
|
|
430
|
-
Rx.defaultsTo(false)
|
|
431
|
-
Rx.distinct()
|
|
429
|
+
end),
|
|
430
|
+
RxBrioUtils.emitOnDeath(false),
|
|
431
|
+
Rx.defaultsTo(false),
|
|
432
|
+
Rx.distinct(),
|
|
432
433
|
})
|
|
433
434
|
end
|
|
434
435
|
|
|
@@ -445,13 +446,12 @@ function TieDefinition:ObserveBrio(adornee: Instance, tieRealm)
|
|
|
445
446
|
|
|
446
447
|
tieRealm = tieRealm or self._defaultTieRealm
|
|
447
448
|
|
|
448
|
-
return self:ObserveValidContainerChildrenBrio(adornee, tieRealm)
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
})
|
|
449
|
+
return self:ObserveValidContainerChildrenBrio(adornee, tieRealm):Pipe({
|
|
450
|
+
RxBrioUtils.switchMapBrio(function(implParent)
|
|
451
|
+
return self:_observeImplementation(implParent, tieRealm)
|
|
452
|
+
end),
|
|
453
|
+
RxBrioUtils.onlyLastBrioSurvives(),
|
|
454
|
+
})
|
|
455
455
|
end
|
|
456
456
|
|
|
457
457
|
--[=[
|
|
@@ -466,7 +466,7 @@ function TieDefinition:Observe(adornee: Instance, tieRealm)
|
|
|
466
466
|
assert(TieRealmUtils.isTieRealm(tieRealm) or tieRealm == nil, "Bad tieRealm")
|
|
467
467
|
|
|
468
468
|
return self:ObserveBrio(adornee, tieRealm):Pipe({
|
|
469
|
-
RxStateStackUtils.topOfStack()
|
|
469
|
+
RxStateStackUtils.topOfStack(),
|
|
470
470
|
})
|
|
471
471
|
end
|
|
472
472
|
|
|
@@ -485,12 +485,11 @@ function TieDefinition:ObserveImplementationsBrio(adornee: Instance, tieRealm)
|
|
|
485
485
|
|
|
486
486
|
tieRealm = tieRealm or self._defaultTieRealm
|
|
487
487
|
|
|
488
|
-
return self:ObserveValidContainerChildrenBrio(adornee, tieRealm)
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
})
|
|
488
|
+
return self:ObserveValidContainerChildrenBrio(adornee, tieRealm):Pipe({
|
|
489
|
+
RxBrioUtils.flatMapBrio(function(implParent)
|
|
490
|
+
return self:_observeImplementation(implParent, tieRealm)
|
|
491
|
+
end),
|
|
492
|
+
})
|
|
494
493
|
end
|
|
495
494
|
|
|
496
495
|
function TieDefinition:ObserveValidContainerChildrenBrio(adornee, tieRealm)
|
|
@@ -639,23 +638,23 @@ function TieDefinition:GetValidContainerNameSet(tieRealm)
|
|
|
639
638
|
if tieRealm == TieRealms.CLIENT then
|
|
640
639
|
-- Shared implements both...
|
|
641
640
|
self._validContainerNameSetWeakCache[tieRealm] = table.freeze({
|
|
642
|
-
[self._definitionName .. "Client"] = true
|
|
643
|
-
[self._definitionName .. "Shared"] = true
|
|
641
|
+
[self._definitionName .. "Client"] = true,
|
|
642
|
+
[self._definitionName .. "Shared"] = true,
|
|
644
643
|
})
|
|
645
644
|
return self._validContainerNameSetWeakCache[tieRealm]
|
|
646
645
|
elseif tieRealm == TieRealms.SERVER then
|
|
647
646
|
self._validContainerNameSetWeakCache[tieRealm] = table.freeze({
|
|
648
|
-
[self._definitionName] = true
|
|
649
|
-
[self._definitionName .. "Shared"] = true
|
|
647
|
+
[self._definitionName] = true,
|
|
648
|
+
[self._definitionName .. "Shared"] = true,
|
|
650
649
|
})
|
|
651
650
|
return self._validContainerNameSetWeakCache[tieRealm]
|
|
652
651
|
elseif tieRealm == TieRealms.SHARED then
|
|
653
652
|
-- Technically on the implementation shared is very strict,
|
|
654
653
|
-- but we allow any calls here for discovery
|
|
655
654
|
self._validContainerNameSetWeakCache[tieRealm] = table.freeze({
|
|
656
|
-
[self._definitionName] = true
|
|
657
|
-
[self._definitionName .. "Client"] = true
|
|
658
|
-
[self._definitionName .. "Shared"] = true
|
|
655
|
+
[self._definitionName] = true,
|
|
656
|
+
[self._definitionName .. "Client"] = true,
|
|
657
|
+
[self._definitionName .. "Shared"] = true,
|
|
659
658
|
})
|
|
660
659
|
return self._validContainerNameSetWeakCache[tieRealm]
|
|
661
660
|
else
|
|
@@ -748,4 +747,4 @@ function TieDefinition:IsImplementation(implParent, tieRealm)
|
|
|
748
747
|
return true
|
|
749
748
|
end
|
|
750
749
|
|
|
751
|
-
return TieDefinition
|
|
750
|
+
return TieDefinition
|
|
@@ -17,7 +17,15 @@ local TieImplementation = setmetatable({}, BaseObject)
|
|
|
17
17
|
TieImplementation.ClassName = "TieImplementation"
|
|
18
18
|
TieImplementation.__index = TieImplementation
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
--[=[
|
|
21
|
+
Constructs a new implementation. Use [TieDefinition.Implement] instead of using this directly.
|
|
22
|
+
|
|
23
|
+
@param tieDefinition TieDefinition
|
|
24
|
+
@param adornee Instance
|
|
25
|
+
@param implementer table
|
|
26
|
+
@param implementationTieRealm TieRealm
|
|
27
|
+
]=]
|
|
28
|
+
function TieImplementation.new(tieDefinition, adornee: Instance, implementer, implementationTieRealm)
|
|
21
29
|
assert(TieRealmUtils.isTieRealm(implementationTieRealm), "Bad implementationTieRealm")
|
|
22
30
|
|
|
23
31
|
local self = setmetatable(BaseObject.new(), TieImplementation)
|
|
@@ -53,14 +61,15 @@ function TieImplementation:__index(index)
|
|
|
53
61
|
return TieImplementation[index]
|
|
54
62
|
end
|
|
55
63
|
|
|
56
|
-
if
|
|
64
|
+
if
|
|
65
|
+
index == "_implParent"
|
|
57
66
|
or index == "_adornee"
|
|
58
67
|
or index == "_tieDefinition"
|
|
59
68
|
or index == "_memberImplementations"
|
|
60
69
|
or index == "_implementationTieRealm"
|
|
61
70
|
or index == "_memberMap"
|
|
62
|
-
or index == "_actualSelf"
|
|
63
|
-
|
|
71
|
+
or index == "_actualSelf"
|
|
72
|
+
then
|
|
64
73
|
return rawget(self, index)
|
|
65
74
|
end
|
|
66
75
|
|
|
@@ -72,7 +81,13 @@ function TieImplementation:__index(index)
|
|
|
72
81
|
if memberDefinition:IsAllowedForImplementation(self._implementationTieRealm) then
|
|
73
82
|
return memberDefinition:GetInterface(self._implParent, self, implementationTieRealm)
|
|
74
83
|
else
|
|
75
|
-
error(
|
|
84
|
+
error(
|
|
85
|
+
string.format(
|
|
86
|
+
"[TieImplementation] - %q is not available on %s",
|
|
87
|
+
memberDefinition:GetFriendlyName(),
|
|
88
|
+
self._implementationTieRealm
|
|
89
|
+
)
|
|
90
|
+
)
|
|
76
91
|
end
|
|
77
92
|
else
|
|
78
93
|
error(string.format("Bad index %q for TieImplementation", tostring(index)))
|
|
@@ -80,14 +95,15 @@ function TieImplementation:__index(index)
|
|
|
80
95
|
end
|
|
81
96
|
|
|
82
97
|
function TieImplementation:__newindex(index, value)
|
|
83
|
-
if
|
|
98
|
+
if
|
|
99
|
+
index == "_implParent"
|
|
84
100
|
or index == "_adornee"
|
|
85
101
|
or index == "_tieDefinition"
|
|
86
102
|
or index == "_memberImplementations"
|
|
87
103
|
or index == "_implementationTieRealm"
|
|
88
104
|
or index == "_memberMap"
|
|
89
|
-
or index == "_actualSelf"
|
|
90
|
-
|
|
105
|
+
or index == "_actualSelf"
|
|
106
|
+
then
|
|
91
107
|
rawset(self, index, value)
|
|
92
108
|
elseif self._memberImplementations[index] then
|
|
93
109
|
self._memberImplementations[index]:SetImplementation(value, self._actualSelf)
|
|
@@ -119,7 +135,9 @@ function TieImplementation:_buildMemberImplementations(implementer)
|
|
|
119
135
|
end
|
|
120
136
|
end
|
|
121
137
|
|
|
122
|
-
local memberImplementation = self._maid:Add(
|
|
138
|
+
local memberImplementation = self._maid:Add(
|
|
139
|
+
memberDefinition:Implement(self._implParent, found, self._actualSelf, self._implementationTieRealm)
|
|
140
|
+
)
|
|
123
141
|
self._memberImplementations[memberDefinition:GetMemberName()] = memberImplementation
|
|
124
142
|
end
|
|
125
143
|
|
|
@@ -127,18 +145,22 @@ function TieImplementation:_buildMemberImplementations(implementer)
|
|
|
127
145
|
end
|
|
128
146
|
|
|
129
147
|
function TieImplementation:_getErrorMessageForNotAllowedMember(memberDefinition)
|
|
130
|
-
local errorMessage = string.format(
|
|
148
|
+
local errorMessage = string.format(
|
|
149
|
+
"[TieImplementation] - Member implements %s only member %s (we are a %s implementation)",
|
|
131
150
|
memberDefinition:GetMemberTieRealm(),
|
|
132
151
|
memberDefinition:GetFriendlyName(),
|
|
133
|
-
self._implementationTieRealm
|
|
152
|
+
self._implementationTieRealm
|
|
153
|
+
)
|
|
134
154
|
|
|
135
155
|
if self._implementationTieRealm == TieRealms.SHARED then
|
|
136
156
|
if memberDefinition:GetMemberTieRealm() ~= TieRealms.SHARED then
|
|
137
|
-
errorMessage = string.format(
|
|
157
|
+
errorMessage = string.format(
|
|
158
|
+
"%s\n\tHINT: This is declared as a %s implementation. %s is only allowed on %s.",
|
|
138
159
|
errorMessage,
|
|
139
160
|
self._implementationTieRealm,
|
|
140
161
|
memberDefinition:GetFriendlyName(),
|
|
141
|
-
memberDefinition:GetMemberTieRealm()
|
|
162
|
+
memberDefinition:GetMemberTieRealm()
|
|
163
|
+
)
|
|
142
164
|
end
|
|
143
165
|
end
|
|
144
166
|
|
|
@@ -146,22 +168,26 @@ function TieImplementation:_getErrorMessageForNotAllowedMember(memberDefinition)
|
|
|
146
168
|
end
|
|
147
169
|
|
|
148
170
|
function TieImplementation:_getErrorMessageRequiredMember(memberDefinition)
|
|
149
|
-
local errorMessage = string.format(
|
|
171
|
+
local errorMessage = string.format(
|
|
172
|
+
"[TieImplementation] - Missing %s member %s (we are a %s implementation)",
|
|
150
173
|
memberDefinition:GetMemberTieRealm(),
|
|
151
174
|
memberDefinition:GetFriendlyName(),
|
|
152
|
-
self._implementationTieRealm
|
|
175
|
+
self._implementationTieRealm
|
|
176
|
+
)
|
|
153
177
|
|
|
154
178
|
if self._implementationTieRealm == TieRealms.SHARED then
|
|
155
179
|
if memberDefinition:GetMemberTieRealm() ~= TieRealms.SHARED then
|
|
156
|
-
errorMessage = string.format(
|
|
180
|
+
errorMessage = string.format(
|
|
181
|
+
"%s\n\tHINT: This is declared as a %s implementation. Shared implements require both client and server components. You could also specify the implementation realm by writing %sInterface.%s:Implement(...)",
|
|
157
182
|
errorMessage,
|
|
158
183
|
self._implementationTieRealm,
|
|
159
184
|
self._tieDefinition:GetName(),
|
|
160
|
-
String.uppercaseFirstLetter(memberDefinition:GetMemberTieRealm())
|
|
185
|
+
String.uppercaseFirstLetter(memberDefinition:GetMemberTieRealm())
|
|
186
|
+
)
|
|
161
187
|
end
|
|
162
188
|
end
|
|
163
189
|
|
|
164
190
|
return errorMessage
|
|
165
191
|
end
|
|
166
192
|
|
|
167
|
-
return TieImplementation
|
|
193
|
+
return TieImplementation
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
--[
|
|
1
|
+
--[[
|
|
2
2
|
@class ActionInterface
|
|
3
|
-
]
|
|
3
|
+
]]
|
|
4
4
|
|
|
5
5
|
local require = require(script.Parent.loader).load(script)
|
|
6
6
|
|
|
7
7
|
local TieDefinition = require("TieDefinition")
|
|
8
8
|
|
|
9
9
|
return TieDefinition.new("Action", {
|
|
10
|
-
DisplayName = "???"
|
|
11
|
-
IsEnabled = false
|
|
12
|
-
Activated = TieDefinition.Types.SIGNAL
|
|
13
|
-
Activate = TieDefinition.Types.METHOD
|
|
14
|
-
})
|
|
10
|
+
DisplayName = "???",
|
|
11
|
+
IsEnabled = false,
|
|
12
|
+
Activated = TieDefinition.Types.SIGNAL,
|
|
13
|
+
Activate = TieDefinition.Types.METHOD,
|
|
14
|
+
})
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
--[
|
|
1
|
+
--[[
|
|
2
2
|
@class OpenableInterface
|
|
3
|
-
]
|
|
3
|
+
]]
|
|
4
4
|
|
|
5
5
|
local require = require(script.Parent.loader).load(script)
|
|
6
6
|
|
|
7
7
|
local TieDefinition = require("TieDefinition")
|
|
8
8
|
|
|
9
9
|
return TieDefinition.new("Openable", {
|
|
10
|
-
Opening = TieDefinition.Types.SIGNAL
|
|
11
|
-
Closing = TieDefinition.Types.SIGNAL
|
|
12
|
-
IsOpen = TieDefinition.Types.PROPERTY
|
|
13
|
-
LastPromise = TieDefinition.Types.PROPERTY
|
|
14
|
-
PromiseOpen = TieDefinition.Types.METHOD
|
|
15
|
-
PromiseClose = TieDefinition.Types.METHOD
|
|
10
|
+
Opening = TieDefinition.Types.SIGNAL,
|
|
11
|
+
Closing = TieDefinition.Types.SIGNAL,
|
|
12
|
+
IsOpen = TieDefinition.Types.PROPERTY,
|
|
13
|
+
LastPromise = TieDefinition.Types.PROPERTY,
|
|
14
|
+
PromiseOpen = TieDefinition.Types.METHOD,
|
|
15
|
+
PromiseClose = TieDefinition.Types.METHOD,
|
|
16
16
|
})
|