backend/analyzer/Logs.go (61 lines of code) (raw):

package analyzer import ( "bytes" "golang.org/x/exp/slices" "log" "reflect" "sort" "text/template" "time" ) type Logs []LogEntry type LogEntry struct { EntityInstanceId string //Fills automatically. Log path EntityName string //Fills automatically. Type of Dynamic Entity (idea log, Thread Dump, etc) Severity string Time time.Time Text string Visible bool } //ConvertToHTML Represents logs as HTML based on Logs.gohtml template func (logs Logs) ConvertToHTML() string { var tpl bytes.Buffer t := template.Must(template.New("Logs.gohtml"). ParseFS(tmplFS, "Logs.gohtml")) err := t.Execute(&tpl, logs) if err != nil { log.Printf("Template Logs.gohtml parsing failed. Error: %s", err.Error()) } return tpl.String() } func (l LogEntry) ConvertToHTML() string { ls := Logs{l} return ls.ConvertToHTML() } // Append adds one log entry of entity with UUID to the struct of logs func (logs *Logs) Append(entityName string, instanceProperties DynamicEntityProperties, entry LogEntry) { entry.EntityInstanceId = instanceProperties.Hash entry.EntityName = entityName entry.Visible = instanceProperties.Visible *logs = append(*logs, entry) } func (logs *Logs) AppendSeveral(entityName string, instanceProperties DynamicEntityProperties, logEntry []LogEntry) { for _, entry := range logEntry { logs.Append(entityName, instanceProperties, entry) } } func (logs *Logs) IsEmpty() bool { return reflect.ValueOf(*logs).IsZero() } func (logs Logs) SortByTime() { sort.Slice(logs, func(i, j int) bool { return logs[i].Time.Before(logs[j].Time) }) } func (logs Logs) ApplyFilters(filters *Filters) { filtersList := filters.getEntriesWithStates() for i, entry := range logs { a := filtersList[entry.EntityInstanceId] logs[i].Visible = a } } func (logs Logs) GetFirstInstanceString(instance *DynamicEntityProperties) string { idx := slices.IndexFunc(logs, func(c LogEntry) bool { return c.EntityInstanceId == instance.Hash }) return logs[idx].ConvertToHTML() }