pkg/analyzer/report.go (70 lines of code) (raw):

package analyzer import ( "fmt" "log/slog" "time" "github.com/JetBrains/ij-perf-report-aggregator/pkg/model" "github.com/valyala/fastjson" ) var parserPool fastjson.ParserPool func ReadReport(runResult *RunResult, config DatabaseConfiguration) error { parser := parserPool.Get() defer parserPool.Put(parser) report, err := parser.ParseBytes(runResult.RawReport) if err != nil { endIndex := min(len(runResult.RawReport), 10000) slog.Warn("invalid report. corrupted JSON, report will be skipped", "error", err, "file", runResult.ReportFileName, "rawReport", runResult.RawReport[:endIndex]) runResult.Report = nil return nil } runResult.Report = &model.Report{ Version: string(report.GetStringBytes("version")), Generated: string(report.GetStringBytes("generated")), Project: string(report.GetStringBytes("project")), ProjectURL: string(report.GetStringBytes("projectURL")), ProjectDescription: string(report.GetStringBytes("projectDescription")), ProductCode: string(report.GetStringBytes("productCode")), MethodName: string(report.GetStringBytes("methodName")), } if config.HasInstallerField { runResult.Report.Build = string(report.GetStringBytes("build")) runResult.Report.BuildDate = string(report.GetStringBytes("buildDate")) } err = config.ReportReader(runResult, report) if err != nil { return nil } runResult.RawReport = report.MarshalTo(nil) return nil } func getBuildTimeFromReport(report *model.Report) (time.Time, error) { var buildTimeUnix time.Time buildTime, err := ParseTime(report.BuildDate) if err != nil { return time.Time{}, err } buildTimeUnix = buildTime return buildTimeUnix, nil } func ParseTime(s string) (time.Time, error) { parsedTime, err := time.Parse(time.RFC1123Z, s) if err != nil { parsedTime, err = time.Parse(time.RFC1123, s) } if err != nil { parsedTime, err = time.Parse("Jan 2, 2006, 3:04:05 PM MST", s) } if err != nil { parsedTime, err = time.Parse("Mon, 2 Jan 2006 15:04:05 -0700", s) } if err != nil { parsedTime, err = time.Parse("Mon, 2 Jan 2006 15:04:05 MST", s) } if err != nil { parsedTime, err = time.Parse("20060102T150405+0000", s) } if err != nil { return time.Time{}, fmt.Errorf("cannot parse time %s: %w", s, err) } return parsedTime, nil }