Reorganize and clean up plugin

This commit is contained in:
Lucien Greathouse
2019-10-01 18:23:29 -07:00
parent bdd9c58cae
commit f9a5fee364
16 changed files with 125 additions and 113 deletions

View File

@@ -1,9 +1,8 @@
local Promise = require(script.Parent.Parent.Promise)
local Http = require(script.Parent.Parent.Http)
local Config = require(script.Parent.Config)
local Version = require(script.Parent.Version)
local Http = require(script.Parent.Http)
local HttpError = require(script.Parent.HttpError)
local ApiContext = {}
ApiContext.__index = ApiContext
@@ -143,7 +142,7 @@ function ApiContext:retrieveMessages()
local function sendRequest()
return Http.get(url)
:catch(function(err)
if err.type == HttpError.Error.Timeout then
if err.type == Http.Error.Kind.Timeout then
return sendRequest()
end

View File

@@ -8,8 +8,6 @@ local Version = require(Plugin.Version)
local Assets = require(Plugin.Assets)
local Theme = require(Plugin.Theme)
local FitText = require(Plugin.Components.FitText)
local e = Roact.createElement
local RojoFooter = Roact.Component:extend("RojoFooter")

View File

@@ -1,75 +0,0 @@
local HttpService = game:GetService("HttpService")
local Promise = require(script.Parent.Parent.Promise)
local Logging = require(script.Parent.Logging)
local HttpError = require(script.Parent.HttpError)
local HttpResponse = require(script.Parent.HttpResponse)
local lastRequestId = 0
-- TODO: Factor out into separate library, especially error handling
local Http = {}
function Http.get(url)
local requestId = lastRequestId + 1
lastRequestId = requestId
Logging.trace("GET(%d) %s", requestId, url)
return Promise.new(function(resolve, reject)
coroutine.wrap(function()
local success, response = pcall(function()
return HttpService:RequestAsync({
Url = url,
Method = "GET",
})
end)
if success then
Logging.trace("Request %d success: status code %s", requestId, response.StatusCode)
resolve(HttpResponse.fromRobloxResponse(response))
else
Logging.trace("Request %d failure: %s", requestId, response)
reject(HttpError.fromErrorString(response))
end
end)()
end)
end
function Http.post(url, body)
local requestId = lastRequestId + 1
lastRequestId = requestId
Logging.trace("POST(%d) %s\n%s", requestId, url, body)
return Promise.new(function(resolve, reject)
coroutine.wrap(function()
local success, response = pcall(function()
return HttpService:RequestAsync({
Url = url,
Method = "POST",
Body = body,
})
end)
if success then
Logging.trace("Request %d success: status code %s", requestId, response.StatusCode)
resolve(HttpResponse.fromRobloxResponse(response))
else
Logging.trace("Request %d failure: %s", requestId, response)
reject(HttpError.fromErrorString(response))
end
end)()
end)
end
function Http.jsonEncode(object)
return HttpService:JSONEncode(object)
end
function Http.jsonDecode(source)
return HttpService:JSONDecode(source)
end
return Http

View File

@@ -1,72 +0,0 @@
local Logging = require(script.Parent.Logging)
local HttpError = {}
HttpError.__index = HttpError
HttpError.Error = {
HttpNotEnabled = {
message = "Rojo requires HTTP access, which is not enabled.\n" ..
"Check your game settings, located in the 'Home' tab of Studio.",
},
ConnectFailed = {
message = "Couldn't connect to the Rojo server.\n" ..
"Make sure the server is running -- use 'rojo serve' to run it!",
},
Timeout = {
message = "Request timed out.",
},
Unknown = {
message = "Unknown error: {{message}}",
},
}
setmetatable(HttpError.Error, {
__index = function(_, key)
error(("%q is not a valid member of HttpError.Error"):format(tostring(key)), 2)
end,
})
function HttpError.new(type, extraMessage)
extraMessage = extraMessage or ""
local message = type.message:gsub("{{message}}", extraMessage)
local err = {
type = type,
message = message,
}
setmetatable(err, HttpError)
return err
end
function HttpError:__tostring()
return self.message
end
--[[
This method shouldn't have to exist. Ugh.
]]
function HttpError.fromErrorString(message)
local lower = message:lower()
if lower:find("^http requests are not enabled") then
return HttpError.new(HttpError.Error.HttpNotEnabled)
end
if lower:find("^httperror: timedout") then
return HttpError.new(HttpError.Error.Timeout)
end
if lower:find("^httperror: connectfail") then
return HttpError.new(HttpError.Error.ConnectFailed)
end
return HttpError.new(HttpError.Error.Unknown, message)
end
function HttpError:report()
Logging.warn(self.message)
end
return HttpError

View File

@@ -1,34 +0,0 @@
local HttpService = game:GetService("HttpService")
local stringTemplate = [[
HttpResponse {
code: %d
body: %s
}]]
local HttpResponse = {}
HttpResponse.__index = HttpResponse
function HttpResponse:__tostring()
return stringTemplate:format(self.code, self.body)
end
function HttpResponse.fromRobloxResponse(response)
local self = {
body = response.Body,
code = response.StatusCode,
headers = response.Headers,
}
return setmetatable(self, HttpResponse)
end
function HttpResponse:isSuccess()
return self.code >= 200 and self.code < 300
end
function HttpResponse:json()
return HttpService:JSONDecode(self.body)
end
return HttpResponse

View File

@@ -1,50 +1,2 @@
local DevSettings = require(script.Parent.DevSettings)
local Level = {
Error = 0,
Warning = 1,
Info = 2,
Trace = 3,
}
local testLogLevel = nil
local function getLogLevel()
if testLogLevel ~= nil then
return testLogLevel
end
return DevSettings:getLogLevel()
end
local function addTags(tag, message)
return tag .. message:gsub("\n", "\n" .. tag)
end
local INFO_TAG = (" "):rep(15) .. "[Rojo-Info] "
local TRACE_TAG = (" "):rep(15) .. "[Rojo-Trace] "
local WARN_TAG = "[Rojo-Warn] "
local Log = {}
Log.Level = Level
function Log.trace(template, ...)
if getLogLevel() >= Level.Trace then
print(addTags(TRACE_TAG, string.format(template, ...)))
end
end
function Log.info(template, ...)
if getLogLevel() >= Level.Info then
print(addTags(INFO_TAG, string.format(template, ...)))
end
end
function Log.warn(template, ...)
if getLogLevel() >= Level.Warning then
warn(addTags(WARN_TAG, string.format(template, ...)))
end
end
return Log
-- TODO: Remove this once all references have been updated.
return require(script.Parent.Parent.Log)

View File

@@ -161,7 +161,10 @@ function Reconciler:__reify(virtualInstancesById, id, parent)
end)
if not ok then
error(("Couldn't create an Instance of type %q, a child of %s"):format(virtualInstance.ClassName, parent:GetFullName()))
error(("Couldn't create an Instance of type %q, a child of %s"):format(
virtualInstance.ClassName,
parent:GetFullName()
))
end
for key, value in pairs(virtualInstance.Properties) do

View File

@@ -2,6 +2,14 @@ if not plugin then
return
end
local Log = require(script.Parent.Log)
local DevSettings = require(script.DevSettings)
Log.setLogLevelThunk(function()
return DevSettings:getLogLevel()
end)
local Roact = require(script.Parent.Roact)
local Config = require(script.Config)