/** * 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 . */ 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 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 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" }