Administration tools: commands and non gameplay server configuration
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

158 lines
5.3 KiB

/**
* Interface class for providing static methods for working with errors,
* that can arise from parsing formatted strings.
* Copyright 2022 Anton Tarasenko
*------------------------------------------------------------------------------
* This file is part of Acedia.
*
* Acedia is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License, or
* (at your option) any later version.
*
* Acedia is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Acedia. If not, see <https://www.gnu.org/licenses/>.
*/
class FormattingReportTool extends AcediaObject
abstract;
var private const int TCASES, TREPORT_HEADER, TUNMATCHED_SINGLE;
var private const int TUNMATCHED_MULTIPLE, TEMPTY_TAG_SINGLE;
var private const int TEMPTY_TAG_MULTIPLE, TBAD_COLOR, TBAD_GRADIENT_POINT;
var private const int TBADSHORT_TAG;
/**
* Outputs report about formatting errors given by `errors` array.
* Reports will be made only if at least one error exists.
*
* @param writer `ConsoleWriter` to output report into.
* @param errors Formatting errors to report.
*/
public final static function Report(
ConsoleWriter writer,
array<FormattingErrorsReport.FormattedStringError> errors)
{
local int i;
local ListBuilder builder;
local MutableText itemList;
builder = ListBuilder(__().memory.Allocate(class'ListBuilder'));
writer.Write(T(default.TREPORT_HEADER));
for (i = 0; i < errors.length; i += 1)
{
if (errors[i].type == FSE_UnmatchedClosingBrackets)
{
ReportCount(
errors[i],
builder,
default.TUNMATCHED_SINGLE,
default.TUNMATCHED_MULTIPLE);
}
else if (errors[i].type == FSE_EmptyColorTag)
{
ReportCount(
errors[i],
builder,
default.TEMPTY_TAG_SINGLE,
default.TEMPTY_TAG_MULTIPLE);
}
else if (errors[i].type == FSE_BadColor) {
builder.Item(T(default.TBAD_COLOR)).Comment(errors[i].cause);
}
else if (errors[i].type == FSE_BadShortColorTag) {
builder.Item(T(default.TBADSHORT_TAG)).Comment(errors[i].cause);
}
else if (errors[i].type == FSE_BadGradientPoint)
{
builder
.Item(T(default.TBAD_GRADIENT_POINT))
.Comment(errors[i].cause);
}
}
itemList = builder.IntoMutableText();
writer.WriteLine(itemList);
__().memory.Free(itemList);
}
/**
* `FormattedStringError` is a struct that can contain a `Text` object that
* needs to be deallocated. This is convenience method that does that.
*
* @param errors Errors, whos `cause` filds must deallocated.
*/
public final static function FreeErrors(
array<FormattingErrorsReport.FormattedStringError> errors)
{
local int i;
for (i = 0; i < errors.length; i += 1) {
__().memory.Free(errors[i].cause);
}
}
private final static function ReportCause(
FormattingErrorsReport.FormattedStringError error,
ListBuilder builder,
int sentence)
{
local MutableText causeBuilder;
if (error.cause == none) {
return;
}
builder.Item(T(sentence));
causeBuilder = __().text.FromIntM(error.count).Append(T(default.TCASES));
builder.Comment(causeBuilder);
__().memory.Free(causeBuilder);
}
// In the methods below, do not double check the error type in the following
// errors or whether `builder != none`
private final static function ReportCount(
FormattingErrorsReport.FormattedStringError error,
ListBuilder builder,
int singleSentence,
int multipleSentence)
{
local MutableText commentBuilder;
if (error.count < 1) {
return;
}
if (error.count == 1)
{
builder.Item(T(singleSentence));
return;
}
builder.Item(T(multipleSentence));
commentBuilder = __().text.FromIntM(error.count).Append(T(default.TCASES));
builder.Comment(commentBuilder);
__().memory.Free(commentBuilder);
}
defaultproperties
{
TCASES = 0
stringConstants(0) = " cases"
TREPORT_HEADER = 1
stringConstants(1) = "{$TextFailure Following formatting errors were found}:"
TUNMATCHED_SINGLE = 2
stringConstants(2) = "unmatched closing curly bracket '&}'"
TUNMATCHED_MULTIPLE = 3
stringConstants(3) = "several unmatched closing curly brackets '&}'"
TEMPTY_TAG_SINGLE = 4
stringConstants(4) = "empty formatting tag"
TEMPTY_TAG_MULTIPLE = 5
stringConstants(5) = "several empty formatting tag"
TBAD_COLOR = 6
stringConstants(6) = "bad color"
TBAD_GRADIENT_POINT = 7
stringConstants(7) = "bad gradient point"
TBADSHORT_TAG = 8
stringConstants(8) = "bad short tag"
}