initialize
This commit is contained in:
129
src/Server/Folder/init.luau
Normal file
129
src/Server/Folder/init.luau
Normal file
@@ -0,0 +1,129 @@
|
||||
local Endpoint = require("../Endpoints")
|
||||
local ErrorTypes = require("@lib/ErrorTypes")
|
||||
|
||||
export type Child = {
|
||||
name: string,
|
||||
object: Endpoint.Endpoint | Folder,
|
||||
type: "folder" | "endpoint",
|
||||
path: string?
|
||||
}
|
||||
|
||||
export type Folder = {
|
||||
name: string,
|
||||
path: string,
|
||||
children: { [string]: Child },
|
||||
error: ErrorTypes.Error,
|
||||
|
||||
addChild: (self: Folder, child: Child) -> Folder,
|
||||
removeChild: (self: Folder, name: string) -> Folder,
|
||||
getChild: (self: Folder, path: string) -> Child?,
|
||||
new: (name: string, path: string) -> Folder
|
||||
}
|
||||
|
||||
local Folder = {}
|
||||
Folder.__index = Folder
|
||||
|
||||
function Folder.new(name: string, path: string): Folder
|
||||
local self = setmetatable({}, Folder)
|
||||
|
||||
self.name = name
|
||||
self.path = path
|
||||
self.children = {}
|
||||
self.error = ErrorTypes.new({
|
||||
name = "Folder",
|
||||
types = {
|
||||
"addChild",
|
||||
"removeChild",
|
||||
"getChild"
|
||||
},
|
||||
exitOnError = true
|
||||
})
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
function Folder:addChild(child: Child): Folder
|
||||
self.error:assert(self.children[child.name] == nil, "addChild", `Child '{child.name}' already exists`)
|
||||
|
||||
child.path = self.path .. "/" .. child.name
|
||||
self.children[child.name] = child
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
function Folder:removeChild(name: string): Folder
|
||||
self.error:assert(self.children[name] ~= nil, "removeChild", `Child '{name}' doesn't exist`)
|
||||
|
||||
self.children[name] = nil
|
||||
return self
|
||||
end
|
||||
|
||||
function Folder:registerEndpoint(name: string, endpointConfig: Endpoint.Endpoint): Endpoint.Endpoint
|
||||
local Endpoint = table.clone(endpointConfig)
|
||||
Endpoint.name = name
|
||||
|
||||
self:addChild({
|
||||
name = name,
|
||||
object = Endpoint,
|
||||
type = "endpoint"
|
||||
})
|
||||
|
||||
return Endpoint
|
||||
end
|
||||
|
||||
function Folder:registerFolder(name: string): Folder
|
||||
local newFolder = Folder.new(name, self.path .. "/" .. name)
|
||||
|
||||
self:addChild({
|
||||
name = name,
|
||||
object = newFolder,
|
||||
type = "folder",
|
||||
path = newFolder.path
|
||||
})
|
||||
|
||||
return newFolder
|
||||
end
|
||||
|
||||
function Folder:unregisterEndpoint(name: string): Folder
|
||||
return self:removeChild(name)
|
||||
end
|
||||
|
||||
function Folder:unregisterFolder(name: string): Folder
|
||||
local Child = self:getChild(name)
|
||||
|
||||
if Child.type == 'folder' then
|
||||
for Index, GrandChild in pairs(Child.children) do
|
||||
if GrandChild.type == 'endpoint' then
|
||||
Child:unregisterEndpoint(Index)
|
||||
else
|
||||
Child:unregisterFolder(Index)
|
||||
end
|
||||
end
|
||||
|
||||
Folder:removeChild(Child.name)
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
function Folder:getChild(path: string): Child?
|
||||
local Parts = string.split(path, "/")
|
||||
local Current = self
|
||||
|
||||
for i = 1, #Parts do
|
||||
local Part = Parts[i]
|
||||
local Child = Current.children[Part]
|
||||
|
||||
if not Child then
|
||||
return nil
|
||||
elseif Child.type == "endpoint" then
|
||||
return Child
|
||||
else
|
||||
Current = Child.object
|
||||
end
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
return Folder
|
Reference in New Issue
Block a user