@quenty/tie 10.6.0 → 10.7.0
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 +19 -0
- package/README.md +4 -0
- package/package.json +16 -15
- package/src/Shared/Members/Methods/TieMethodDefinition.lua +44 -0
- package/src/Shared/{Implementation → Members/Methods}/TieMethodImplementation.lua +4 -5
- package/src/Shared/Members/Methods/TieMethodInterfaceUtils.lua +58 -0
- package/src/Shared/{Interface → Members/Properties}/TiePropertyChangedSignalConnection.lua +1 -1
- package/src/Shared/Members/Properties/TiePropertyDefinition.lua +58 -0
- package/src/Shared/{Interface → Members/Properties}/TiePropertyInterface.lua +42 -59
- package/src/Shared/Members/Signals/TieSignalConnection.lua +63 -0
- package/src/Shared/Members/Signals/TieSignalDefinition.lua +38 -0
- package/src/Shared/{Implementation → Members/Signals}/TieSignalImplementation.lua +29 -15
- package/src/Shared/Members/Signals/TieSignalInterface.lua +90 -0
- package/src/Shared/Members/TieMemberDefinition.lua +104 -0
- package/src/Shared/Members/TieMemberInterface.lua +94 -0
- package/src/Shared/Realms/TieRealmUtils.lua +41 -0
- package/src/Shared/{Definition/Types → Realms}/TieRealms.lua +3 -4
- package/src/Shared/Services/TieRealmService.lua +31 -0
- package/src/Shared/TieDefinition.lua +708 -0
- package/src/Shared/TieImplementation.lua +167 -0
- package/src/Shared/TieInterface.lua +129 -0
- package/src/Shared/{Encoding → Utils}/TieUtils.lua +4 -1
- package/test/modules/Server/Action/Action.lua +4 -7
- package/test/modules/Server/Door.lua +5 -10
- package/test/scripts/Server/ServerMain.server.lua +3 -3
- package/src/Shared/Definition/TieDefinition.lua +0 -507
- package/src/Shared/Definition/TieMethodDefinition.lua +0 -61
- package/src/Shared/Definition/TiePropertyDefinition.lua +0 -64
- package/src/Shared/Definition/TieSignalDefinition.lua +0 -59
- package/src/Shared/Definition/Types/TieRealmUtils.lua +0 -60
- package/src/Shared/Implementation/TieImplementation.lua +0 -129
- package/src/Shared/Interface/TieInterface.lua +0 -122
- package/src/Shared/Interface/TieInterfaceUtils.lua +0 -70
- package/src/Shared/Interface/TieMethodInterfaceUtils.lua +0 -43
- package/src/Shared/Interface/TieSignalConnection.lua +0 -89
- package/src/Shared/Interface/TieSignalInterface.lua +0 -61
- /package/src/Shared/{Implementation → Members/Properties}/TiePropertyImplementation.lua +0 -0
- /package/src/Shared/{Implementation → Members/Properties}/TiePropertyImplementationUtils.lua +0 -0
|
@@ -1,507 +0,0 @@
|
|
|
1
|
-
--[=[
|
|
2
|
-
@class TieDefinition
|
|
3
|
-
]=]
|
|
4
|
-
|
|
5
|
-
local require = require(script.Parent.loader).load(script)
|
|
6
|
-
|
|
7
|
-
local RunService = game:GetService("RunService")
|
|
8
|
-
|
|
9
|
-
local Brio = require("Brio")
|
|
10
|
-
local Maid = require("Maid")
|
|
11
|
-
local Observable = require("Observable")
|
|
12
|
-
local Rx = require("Rx")
|
|
13
|
-
local RxBrioUtils = require("RxBrioUtils")
|
|
14
|
-
local RxCollectionServiceUtils = require("RxCollectionServiceUtils")
|
|
15
|
-
local RxInstanceUtils = require("RxInstanceUtils")
|
|
16
|
-
local RxStateStackUtils = require("RxStateStackUtils")
|
|
17
|
-
local String = require("String")
|
|
18
|
-
local Symbol = require("Symbol")
|
|
19
|
-
local Table = require("Table")
|
|
20
|
-
local TieImplementation = require("TieImplementation")
|
|
21
|
-
local TieInterface = require("TieInterface")
|
|
22
|
-
local TieMethodDefinition = require("TieMethodDefinition")
|
|
23
|
-
local TiePropertyDefinition = require("TiePropertyDefinition")
|
|
24
|
-
local TieRealms = require("TieRealms")
|
|
25
|
-
local TieSignalDefinition = require("TieSignalDefinition")
|
|
26
|
-
local ValueObject = require("ValueObject")
|
|
27
|
-
|
|
28
|
-
local UNSET_VALUE = Symbol.named("unsetValue")
|
|
29
|
-
|
|
30
|
-
local TieDefinition = {}
|
|
31
|
-
TieDefinition.ClassName = "TieDefinition"
|
|
32
|
-
TieDefinition.__index = TieDefinition
|
|
33
|
-
|
|
34
|
-
TieDefinition.Types = Table.readonly({
|
|
35
|
-
METHOD = Symbol.named("method");
|
|
36
|
-
SIGNAL = Symbol.named("signal");
|
|
37
|
-
PROPERTY = Symbol.named("property"); -- will default to nil
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
TieDefinition.Realms = TieRealms
|
|
41
|
-
|
|
42
|
-
function TieDefinition.new(definitionName, members, isSharedDefinition)
|
|
43
|
-
local self = setmetatable({}, TieDefinition)
|
|
44
|
-
|
|
45
|
-
self._definitionName = assert(definitionName, "No definitionName")
|
|
46
|
-
self._memberMap = {}
|
|
47
|
-
|
|
48
|
-
self._isSharedDefinition = isSharedDefinition
|
|
49
|
-
|
|
50
|
-
self:_addMembers(members, TieDefinition.Realms.SHARED)
|
|
51
|
-
|
|
52
|
-
return self
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
function TieDefinition:_addMembers(members, realm)
|
|
56
|
-
for memberName, memberTypeOrDefaultValue in pairs(members) do
|
|
57
|
-
if memberName == TieRealms.CLIENT then
|
|
58
|
-
self:_addMembers(memberTypeOrDefaultValue, TieRealms.CLIENT)
|
|
59
|
-
elseif memberName == TieRealms.SERVER then
|
|
60
|
-
self:_addMembers(memberTypeOrDefaultValue, TieRealms.SERVER)
|
|
61
|
-
else
|
|
62
|
-
assert(type(memberName) == "string", "Bad memberName")
|
|
63
|
-
|
|
64
|
-
self:_addMember(memberName, memberTypeOrDefaultValue, realm)
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
function TieDefinition:_addMember(memberName, memberTypeOrDefaultValue, realm)
|
|
70
|
-
if memberTypeOrDefaultValue == TieDefinition.Types.METHOD then
|
|
71
|
-
self._memberMap[memberName] = TieMethodDefinition.new(self, memberName, realm)
|
|
72
|
-
elseif memberTypeOrDefaultValue == TieDefinition.Types.SIGNAL then
|
|
73
|
-
self._memberMap[memberName] = TieSignalDefinition.new(self, memberName, realm)
|
|
74
|
-
elseif memberTypeOrDefaultValue == TieDefinition.Types.PROPERTY then
|
|
75
|
-
self._memberMap[memberName] = TiePropertyDefinition.new(self, memberName, nil, realm)
|
|
76
|
-
else
|
|
77
|
-
self._memberMap[memberName] = TiePropertyDefinition.new(self, memberName, memberTypeOrDefaultValue, realm)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
--[=[
|
|
82
|
-
Gets all valid interfaces for this adornee
|
|
83
|
-
@param adornee Instance
|
|
84
|
-
@return { TieInterface }
|
|
85
|
-
]=]
|
|
86
|
-
function TieDefinition:GetImplementations(adornee: Instance)
|
|
87
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
88
|
-
|
|
89
|
-
local implementations = {}
|
|
90
|
-
|
|
91
|
-
local containerName = self:GetContainerName()
|
|
92
|
-
for _, item in pairs(adornee:GetChildren()) do
|
|
93
|
-
if item.Name == containerName then
|
|
94
|
-
if self:IsImplementation(item) then
|
|
95
|
-
table.insert(implementations, TieInterface.new(self, item, nil))
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
return implementations
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
--[=[
|
|
104
|
-
Observes all the children implementations for this adornee
|
|
105
|
-
|
|
106
|
-
@param adornee Instance
|
|
107
|
-
@return Observable<Brio<TieInterface>>
|
|
108
|
-
]=]
|
|
109
|
-
function TieDefinition:ObserveChildrenBrio(adornee: Instance)
|
|
110
|
-
return RxInstanceUtils.observeChildrenBrio(adornee):Pipe({
|
|
111
|
-
RxBrioUtils.flatMapBrio(function(child)
|
|
112
|
-
return self:ObserveBrio(child)
|
|
113
|
-
end)
|
|
114
|
-
})
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
--[=[
|
|
118
|
-
Promises the implementation
|
|
119
|
-
|
|
120
|
-
@param adornee Adornee
|
|
121
|
-
@return Promise<TieInterface>
|
|
122
|
-
]=]
|
|
123
|
-
function TieDefinition:Promise(adornee)
|
|
124
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
125
|
-
|
|
126
|
-
-- TODO: Support cancellation cleanup here.
|
|
127
|
-
|
|
128
|
-
return Rx.toPromise(self:Observe(adornee):Pipe({
|
|
129
|
-
Rx.where(function(value)
|
|
130
|
-
return value ~= nil
|
|
131
|
-
end)
|
|
132
|
-
}))
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
--[=[
|
|
136
|
-
Gets all valid interfaces for this adornee's children
|
|
137
|
-
|
|
138
|
-
@param adornee Instance
|
|
139
|
-
@return { TieInterface }
|
|
140
|
-
]=]
|
|
141
|
-
function TieDefinition:GetChildren(adornee: Instance)
|
|
142
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
143
|
-
|
|
144
|
-
local implementations = {}
|
|
145
|
-
|
|
146
|
-
-- TODO: Make this faster
|
|
147
|
-
for _, item in pairs(adornee:GetChildren()) do
|
|
148
|
-
for _, option in pairs(self:GetImplementations(item)) do
|
|
149
|
-
table.insert(implementations, option)
|
|
150
|
-
end
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
return implementations
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
--[=[
|
|
157
|
-
Finds the implementation on the adornee. Alais for [FindFirstImplementation]
|
|
158
|
-
|
|
159
|
-
@param adornee Adornee
|
|
160
|
-
@return TieInterface | nil
|
|
161
|
-
]=]
|
|
162
|
-
function TieDefinition:Find(adornee: Instance)
|
|
163
|
-
return self:FindFirstImplementation(adornee)
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
--[=[
|
|
167
|
-
Observes all implementations that are tagged with the given tag name
|
|
168
|
-
|
|
169
|
-
@param tagName string
|
|
170
|
-
@return TieInterface | nil
|
|
171
|
-
]=]
|
|
172
|
-
function TieDefinition:ObserveAllTaggedBrio(tagName)
|
|
173
|
-
assert(type(tagName) == "string", "Bad tagName")
|
|
174
|
-
|
|
175
|
-
return RxCollectionServiceUtils.observeTaggedBrio(tagName):Pipe({
|
|
176
|
-
RxBrioUtils.flatMapBrio(function(instance)
|
|
177
|
-
return self:ObserveBrio(instance)
|
|
178
|
-
end)
|
|
179
|
-
})
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
--[=[
|
|
183
|
-
Finds the first valid interfaces for this adornee
|
|
184
|
-
@param adornee Instance
|
|
185
|
-
@return TieInterface
|
|
186
|
-
]=]
|
|
187
|
-
function TieDefinition:FindFirstImplementation(adornee: Instance)
|
|
188
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
189
|
-
|
|
190
|
-
local containerName = self:GetContainerName()
|
|
191
|
-
for _, item in pairs(adornee:GetChildren()) do
|
|
192
|
-
if item.Name == containerName then
|
|
193
|
-
if self:IsImplementation(item) then
|
|
194
|
-
return TieInterface.new(self, item, nil)
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
return nil
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
--[=[
|
|
203
|
-
Returns true if the adornee implements the interface, and false otherwise.
|
|
204
|
-
@param adornee Instance
|
|
205
|
-
@return boolean
|
|
206
|
-
]=]
|
|
207
|
-
function TieDefinition:HasImplementation(adornee: Instance)
|
|
208
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
209
|
-
|
|
210
|
-
local folder = adornee:FindFirstChild(self:GetContainerName())
|
|
211
|
-
if not folder then
|
|
212
|
-
return false
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
return self:IsImplementation(folder)
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
--[=[
|
|
219
|
-
Observes whether the adornee implements the interface.
|
|
220
|
-
@param adornee Instance
|
|
221
|
-
@return Observable<boolean>>
|
|
222
|
-
]=]
|
|
223
|
-
function TieDefinition:ObserveIsImplemented(adornee: Instance): boolean
|
|
224
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
225
|
-
|
|
226
|
-
return self:ObserveLastImplementationBrio(adornee)
|
|
227
|
-
:Pipe({
|
|
228
|
-
RxBrioUtils.map(function(result)
|
|
229
|
-
return result and true or false
|
|
230
|
-
end);
|
|
231
|
-
RxBrioUtils.emitOnDeath(false);
|
|
232
|
-
Rx.defaultsTo(false);
|
|
233
|
-
Rx.distinct();
|
|
234
|
-
})
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
--[=[
|
|
238
|
-
Observes whether the folder is a valid implementation
|
|
239
|
-
@param folder Instance
|
|
240
|
-
@return Observable<boolean>>
|
|
241
|
-
]=]
|
|
242
|
-
function TieDefinition:ObserveIsImplementation(folder: Folder)
|
|
243
|
-
return self:_observeImplementation(folder)
|
|
244
|
-
:Pipe({
|
|
245
|
-
RxBrioUtils.map(function(result)
|
|
246
|
-
return result and true or false
|
|
247
|
-
end);
|
|
248
|
-
RxBrioUtils.emitOnDeath(false);
|
|
249
|
-
Rx.defaultsTo(false);
|
|
250
|
-
Rx.distinct();
|
|
251
|
-
})
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
--[=[
|
|
255
|
-
Observes whether the folder is a valid implementation on the given adornee
|
|
256
|
-
@param folder Instance
|
|
257
|
-
@param adornee Instance
|
|
258
|
-
@return Observable<boolean>>
|
|
259
|
-
]=]
|
|
260
|
-
function TieDefinition:ObserveIsImplementedOn(folder: Folder, adornee: Instance)
|
|
261
|
-
assert(typeof(folder) == "Instance", "Bad folder")
|
|
262
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
263
|
-
|
|
264
|
-
return RxInstanceUtils.observePropertyBrio(folder, "Parent", function(parent)
|
|
265
|
-
return parent == adornee
|
|
266
|
-
end):Pipe({
|
|
267
|
-
RxBrioUtils.switchMapBrio(function()
|
|
268
|
-
return self:_observeImplementation(folder)
|
|
269
|
-
end);
|
|
270
|
-
RxBrioUtils.map(function(result)
|
|
271
|
-
return result and true or false
|
|
272
|
-
end);
|
|
273
|
-
RxBrioUtils.emitOnDeath(false);
|
|
274
|
-
Rx.defaultsTo(false);
|
|
275
|
-
Rx.distinct();
|
|
276
|
-
})
|
|
277
|
-
end
|
|
278
|
-
|
|
279
|
-
--[=[
|
|
280
|
-
Observes a valid implementation wrapped in a brio if it exists.
|
|
281
|
-
@param adornee Instance
|
|
282
|
-
@return Observable<Brio<TieImplementation<T>>>
|
|
283
|
-
]=]
|
|
284
|
-
function TieDefinition:ObserveLastImplementationBrio(adornee: Instance)
|
|
285
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
286
|
-
|
|
287
|
-
return RxInstanceUtils.observeLastNamedChildBrio(adornee, "Folder", self:GetContainerName())
|
|
288
|
-
:Pipe({
|
|
289
|
-
RxBrioUtils.switchMapBrio(function(folder)
|
|
290
|
-
return self:_observeImplementation(folder)
|
|
291
|
-
end);
|
|
292
|
-
RxBrioUtils.onlyLastBrioSurvives();
|
|
293
|
-
})
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
function TieDefinition:ObserveBrio(adornee: Instance)
|
|
297
|
-
return self:ObserveLastImplementationBrio(adornee)
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
--[=[
|
|
301
|
-
Observes a valid implementation if it exists, or nil
|
|
302
|
-
|
|
303
|
-
@param adornee Instance
|
|
304
|
-
@return Observable<TieImplementation<T> | nil>>
|
|
305
|
-
]=]
|
|
306
|
-
function TieDefinition:ObserveLastImplementation(adornee: Instance)
|
|
307
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
308
|
-
|
|
309
|
-
return self:ObserveLastImplementationBrio(adornee):Pipe({
|
|
310
|
-
RxStateStackUtils.topOfStack();
|
|
311
|
-
})
|
|
312
|
-
end
|
|
313
|
-
|
|
314
|
-
function TieDefinition:Observe(adornee: Instance)
|
|
315
|
-
return self:ObserveLastImplementation(adornee)
|
|
316
|
-
end
|
|
317
|
-
|
|
318
|
-
--[=[
|
|
319
|
-
Observes valid implementations wrapped in a brio if it exists.
|
|
320
|
-
@param adornee Instance
|
|
321
|
-
@return Observable<Brio<TieImplementation<T>>>
|
|
322
|
-
]=]
|
|
323
|
-
function TieDefinition:ObserveImplementationsBrio(adornee: Instance)
|
|
324
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
325
|
-
|
|
326
|
-
return RxInstanceUtils.observeChildrenOfNameBrio(adornee, "Folder", self:GetContainerName())
|
|
327
|
-
:Pipe({
|
|
328
|
-
RxBrioUtils.flatMapBrio(function(folder)
|
|
329
|
-
return self:_observeImplementation(folder)
|
|
330
|
-
end)
|
|
331
|
-
})
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
function TieDefinition:_observeImplementation(folder)
|
|
335
|
-
return Observable.new(function(sub)
|
|
336
|
-
-- Bind to all children, instead of individually. This is a
|
|
337
|
-
-- performance gain.
|
|
338
|
-
|
|
339
|
-
local maid = Maid.new()
|
|
340
|
-
|
|
341
|
-
local update
|
|
342
|
-
do
|
|
343
|
-
local isImplemented = maid:Add(ValueObject.new(UNSET_VALUE))
|
|
344
|
-
|
|
345
|
-
maid:GiveTask(isImplemented.Changed:Connect(function()
|
|
346
|
-
maid._brio = nil
|
|
347
|
-
|
|
348
|
-
if not sub:IsPending() then
|
|
349
|
-
return
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
if isImplemented.Value then
|
|
353
|
-
local brio = Brio.new(TieInterface.new(self, folder, nil))
|
|
354
|
-
sub:Fire(brio)
|
|
355
|
-
maid._brio = brio
|
|
356
|
-
else
|
|
357
|
-
maid._brio = nil
|
|
358
|
-
end
|
|
359
|
-
end))
|
|
360
|
-
|
|
361
|
-
function update()
|
|
362
|
-
isImplemented.Value = self:IsImplementation(folder)
|
|
363
|
-
end
|
|
364
|
-
end
|
|
365
|
-
|
|
366
|
-
maid:GiveTask(folder.ChildAdded:Connect(function(child)
|
|
367
|
-
maid[child] = child:GetPropertyChangedSignal("Name"):Connect(update)
|
|
368
|
-
update()
|
|
369
|
-
end))
|
|
370
|
-
|
|
371
|
-
for memberName, member in pairs(self:GetMemberMap()) do
|
|
372
|
-
if not member:IsAllowed() then
|
|
373
|
-
continue
|
|
374
|
-
end
|
|
375
|
-
|
|
376
|
-
if member.ClassName == "TiePropertyDefinition" then
|
|
377
|
-
maid:GiveTask(folder:GetAttributeChangedSignal(memberName):Connect(update))
|
|
378
|
-
end
|
|
379
|
-
end
|
|
380
|
-
|
|
381
|
-
maid:GiveTask(folder.ChildRemoved:Connect(function(child)
|
|
382
|
-
maid[child] = nil
|
|
383
|
-
update()
|
|
384
|
-
end))
|
|
385
|
-
|
|
386
|
-
for _, child in pairs(folder:GetChildren()) do
|
|
387
|
-
maid[child] = child:GetPropertyChangedSignal("Name"):Connect(update)
|
|
388
|
-
end
|
|
389
|
-
|
|
390
|
-
update()
|
|
391
|
-
|
|
392
|
-
return maid
|
|
393
|
-
end)
|
|
394
|
-
end
|
|
395
|
-
|
|
396
|
-
--[=[
|
|
397
|
-
Ensures implementation of the object, binding table values and Lua OOP objects
|
|
398
|
-
to Roblox objects that can be invoked generally.
|
|
399
|
-
|
|
400
|
-
```lua
|
|
401
|
-
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
@param adornee Instance -- Adornee to implement interface on
|
|
405
|
-
@param implementer table? -- Table with all interface values or nil
|
|
406
|
-
@return TieImplementation<T>
|
|
407
|
-
]=]
|
|
408
|
-
function TieDefinition:Implement(adornee: Instance, implementer)
|
|
409
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
410
|
-
assert(type(implementer) == "table" or implementer == nil, "Bad implementer")
|
|
411
|
-
|
|
412
|
-
return TieImplementation.new(self, adornee, implementer)
|
|
413
|
-
end
|
|
414
|
-
|
|
415
|
-
--[=[
|
|
416
|
-
Gets an interface to the tie definition. Not this can be done
|
|
417
|
-
on any Roblox instance. If the instance does not implement the interface,
|
|
418
|
-
invoking interface methods, or querying the interface will result
|
|
419
|
-
in errors.
|
|
420
|
-
|
|
421
|
-
@param adornee Instance -- Adornee to get interface on
|
|
422
|
-
@return TieInterface<T>
|
|
423
|
-
]=]
|
|
424
|
-
function TieDefinition:Get(adornee: Instance)
|
|
425
|
-
assert(typeof(adornee) == "Instance", "Bad adornee")
|
|
426
|
-
|
|
427
|
-
return TieInterface.new(self, nil, adornee)
|
|
428
|
-
end
|
|
429
|
-
|
|
430
|
-
--[=[
|
|
431
|
-
Gets the name of the definition
|
|
432
|
-
@return string
|
|
433
|
-
]=]
|
|
434
|
-
function TieDefinition:GetName(): string
|
|
435
|
-
return self._definitionName
|
|
436
|
-
end
|
|
437
|
-
|
|
438
|
-
function TieDefinition:GetContainerNameForServer()
|
|
439
|
-
return self._definitionName
|
|
440
|
-
end
|
|
441
|
-
|
|
442
|
-
function TieDefinition:GetContainerName(): string
|
|
443
|
-
if RunService:IsClient() and not self._isSharedDefinition then
|
|
444
|
-
return self._definitionName .. "Client"
|
|
445
|
-
else
|
|
446
|
-
return self._definitionName
|
|
447
|
-
end
|
|
448
|
-
end
|
|
449
|
-
|
|
450
|
-
function TieDefinition:GetMemberMap()
|
|
451
|
-
return self._memberMap
|
|
452
|
-
end
|
|
453
|
-
|
|
454
|
-
--[=[
|
|
455
|
-
Returns true if the folder is an implementation
|
|
456
|
-
|
|
457
|
-
@param folder Folder
|
|
458
|
-
@return boolean
|
|
459
|
-
]=]
|
|
460
|
-
function TieDefinition:IsImplementation(folder)
|
|
461
|
-
assert(typeof(folder) == "Instance", "Bad folder")
|
|
462
|
-
|
|
463
|
-
local attributes = folder:GetAttributes()
|
|
464
|
-
local children = {}
|
|
465
|
-
for _, item in pairs(folder:GetChildren()) do
|
|
466
|
-
children[item.Name] = item
|
|
467
|
-
end
|
|
468
|
-
|
|
469
|
-
for memberName, member in pairs(self:GetMemberMap()) do
|
|
470
|
-
if not member:IsRequired() then
|
|
471
|
-
continue
|
|
472
|
-
end
|
|
473
|
-
|
|
474
|
-
local found = children[memberName]
|
|
475
|
-
if not found then
|
|
476
|
-
if member.ClassName == "TiePropertyDefinition" then
|
|
477
|
-
if attributes[memberName] == nil then
|
|
478
|
-
return false
|
|
479
|
-
else
|
|
480
|
-
continue
|
|
481
|
-
end
|
|
482
|
-
end
|
|
483
|
-
|
|
484
|
-
return false
|
|
485
|
-
end
|
|
486
|
-
|
|
487
|
-
if member.ClassName == "TieMethodDefinition" then
|
|
488
|
-
if not found:IsA("BindableFunction") then
|
|
489
|
-
return false
|
|
490
|
-
end
|
|
491
|
-
elseif member.ClassName == "TieSignalDefinition" then
|
|
492
|
-
if not found:IsA("BindableEvent") then
|
|
493
|
-
return false
|
|
494
|
-
end
|
|
495
|
-
elseif member.ClassName == "TiePropertyDefinition" then
|
|
496
|
-
if not (found:IsA("BindableFunction") or String.endsWith(found.ClassName, "Value")) then
|
|
497
|
-
return false
|
|
498
|
-
end
|
|
499
|
-
else
|
|
500
|
-
error("[TieDefinition.IsImplementation] - Unknown member type")
|
|
501
|
-
end
|
|
502
|
-
end
|
|
503
|
-
|
|
504
|
-
return true
|
|
505
|
-
end
|
|
506
|
-
|
|
507
|
-
return TieDefinition
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
--[=[
|
|
2
|
-
@class TieMethodDefinition
|
|
3
|
-
]=]
|
|
4
|
-
|
|
5
|
-
local require = require(script.Parent.loader).load(script)
|
|
6
|
-
|
|
7
|
-
local TieMethodImplementation = require("TieMethodImplementation")
|
|
8
|
-
local TieMethodInterfaceUtils = require("TieMethodInterfaceUtils")
|
|
9
|
-
local TieRealmUtils = require("TieRealmUtils")
|
|
10
|
-
|
|
11
|
-
local TieMethodDefinition = {}
|
|
12
|
-
TieMethodDefinition.ClassName = "TieMethodDefinition"
|
|
13
|
-
TieMethodDefinition.__index = TieMethodDefinition
|
|
14
|
-
|
|
15
|
-
function TieMethodDefinition.new(tieDefinition, methodName, realm)
|
|
16
|
-
local self = setmetatable({}, TieMethodDefinition)
|
|
17
|
-
|
|
18
|
-
self._tieDefinition = assert(tieDefinition, "No tieDefinition")
|
|
19
|
-
self._methodName = assert(methodName, "No methodName")
|
|
20
|
-
self._tieRealm = assert(realm, "No realm")
|
|
21
|
-
self._isRequired = TieRealmUtils.isRequired(self._tieRealm)
|
|
22
|
-
self._isAllowed = TieRealmUtils.isAllowed(self._tieRealm)
|
|
23
|
-
|
|
24
|
-
return self
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
function TieMethodDefinition:IsRequired()
|
|
28
|
-
return self._isRequired
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
function TieMethodDefinition:IsAllowed()
|
|
32
|
-
return self._isAllowed
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
function TieMethodDefinition:Implement(folder, initialValue, actualSelf)
|
|
36
|
-
assert(typeof(folder) == "Instance", "Bad folder")
|
|
37
|
-
assert(actualSelf, "No actualSelf")
|
|
38
|
-
|
|
39
|
-
return TieMethodImplementation.new(self, folder, initialValue, actualSelf)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
function TieMethodDefinition:GetInterface(folder: Folder, aliasSelf)
|
|
43
|
-
assert(typeof(folder) == "Instance", "Bad folder")
|
|
44
|
-
assert(aliasSelf, "No aliasSelf")
|
|
45
|
-
|
|
46
|
-
return TieMethodInterfaceUtils.get(aliasSelf, self._tieDefinition, self, folder, nil)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
function TieMethodDefinition:GetTieRealm()
|
|
50
|
-
return self._tieRealm
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
function TieMethodDefinition:GetTieDefinition()
|
|
54
|
-
return self._tieDefinition
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
function TieMethodDefinition:GetMemberName()
|
|
58
|
-
return self._methodName
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
return TieMethodDefinition
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
--[=[
|
|
2
|
-
@class TiePropertyDefinition
|
|
3
|
-
]=]
|
|
4
|
-
|
|
5
|
-
local require = require(script.Parent.loader).load(script)
|
|
6
|
-
|
|
7
|
-
local TiePropertyImplementation = require("TiePropertyImplementation")
|
|
8
|
-
local TiePropertyInterface = require("TiePropertyInterface")
|
|
9
|
-
local TieRealmUtils = require("TieRealmUtils")
|
|
10
|
-
|
|
11
|
-
local TiePropertyDefinition = {}
|
|
12
|
-
TiePropertyDefinition.ClassName = "TiePropertyDefinition"
|
|
13
|
-
TiePropertyDefinition.__index = TiePropertyDefinition
|
|
14
|
-
|
|
15
|
-
function TiePropertyDefinition.new(tieDefinition, propertyName: string, defaultValue: any, realm)
|
|
16
|
-
local self = setmetatable({}, TiePropertyDefinition)
|
|
17
|
-
|
|
18
|
-
self._tieDefinition = assert(tieDefinition, "No tieDefinition")
|
|
19
|
-
self._propertyName = assert(propertyName, "No propertyName")
|
|
20
|
-
self._defaultValue = defaultValue
|
|
21
|
-
self._tieRealm = assert(realm, "No realm")
|
|
22
|
-
self._isRequired = TieRealmUtils.isRequired(self._tieRealm)
|
|
23
|
-
self._isAllowed = TieRealmUtils.isAllowed(self._tieRealm)
|
|
24
|
-
|
|
25
|
-
return self
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
function TiePropertyDefinition:GetTieDefinition()
|
|
29
|
-
return self._tieDefinition
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
function TiePropertyDefinition:GetDefaultValue()
|
|
33
|
-
return self._defaultValue
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
function TiePropertyDefinition:IsRequired(): boolean
|
|
37
|
-
return self._isRequired
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
function TiePropertyDefinition:IsAllowed(): boolean
|
|
41
|
-
return self._isAllowed
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
function TiePropertyDefinition:GetTieRealm()
|
|
45
|
-
return self._tieRealm
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
function TiePropertyDefinition:Implement(folder: Folder, initialValue)
|
|
49
|
-
assert(typeof(folder) == "Instance", "Bad folder")
|
|
50
|
-
|
|
51
|
-
return TiePropertyImplementation.new(self, folder, initialValue)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
function TiePropertyDefinition:GetInterface(folder: Folder)
|
|
55
|
-
assert(typeof(folder) == "Instance", "Bad folder")
|
|
56
|
-
|
|
57
|
-
return TiePropertyInterface.new(folder, nil, self)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
function TiePropertyDefinition:GetMemberName(): string
|
|
61
|
-
return self._propertyName
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
return TiePropertyDefinition
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
--[=[
|
|
2
|
-
@class TieSignalDefinition
|
|
3
|
-
]=]
|
|
4
|
-
|
|
5
|
-
local require = require(script.Parent.loader).load(script)
|
|
6
|
-
|
|
7
|
-
local TieSignalImplementation = require("TieSignalImplementation")
|
|
8
|
-
local TieSignalInterface = require("TieSignalInterface")
|
|
9
|
-
local TieRealmUtils = require("TieRealmUtils")
|
|
10
|
-
|
|
11
|
-
local TieSignalDefinition = {}
|
|
12
|
-
TieSignalDefinition.ClassName = "TieSignalDefinition"
|
|
13
|
-
TieSignalDefinition.__index = TieSignalDefinition
|
|
14
|
-
|
|
15
|
-
function TieSignalDefinition.new(tieDefinition, signalName, realm)
|
|
16
|
-
local self = setmetatable({}, TieSignalDefinition)
|
|
17
|
-
|
|
18
|
-
self._tieDefinition = assert(tieDefinition, "No tieDefinition")
|
|
19
|
-
self._signalName = assert(signalName, "No signalName")
|
|
20
|
-
self._tieRealm = assert(realm, "No realm")
|
|
21
|
-
self._isRequired = TieRealmUtils.isRequired(self._tieRealm)
|
|
22
|
-
self._isAllowed = TieRealmUtils.isAllowed(self._tieRealm)
|
|
23
|
-
|
|
24
|
-
return self
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
function TieSignalDefinition:GetTieDefinition()
|
|
28
|
-
return self._tieDefinition
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
function TieSignalDefinition:IsRequired()
|
|
32
|
-
return self._isRequired
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
function TieSignalDefinition:IsAllowed()
|
|
36
|
-
return self._isAllowed
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
function TieSignalDefinition:GetTieRealm()
|
|
40
|
-
return self._tieRealm
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
function TieSignalDefinition:Implement(folder, initialValue)
|
|
44
|
-
assert(typeof(folder) == "Instance", "Bad folder")
|
|
45
|
-
|
|
46
|
-
return TieSignalImplementation.new(self, folder, initialValue)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
function TieSignalDefinition:GetInterface(folder: Folder)
|
|
50
|
-
assert(typeof(folder) == "Instance", "Bad folder")
|
|
51
|
-
|
|
52
|
-
return TieSignalInterface.new(folder, nil, self)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
function TieSignalDefinition:GetMemberName()
|
|
56
|
-
return self._signalName
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
return TieSignalDefinition
|