Files
umbrix/lib/domain/singbox/box_log.dart

63 lines
1.3 KiB
Dart

import 'package:dartx/dartx.dart';
import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:tint/tint.dart';
part 'box_log.freezed.dart';
enum LogLevel {
trace,
debug,
info,
warn,
error,
fatal,
panic;
static List<LogLevel> get choices => values.takeFirst(4);
Color? get color => switch (this) {
trace => Colors.lightBlueAccent,
debug => Colors.grey,
info => Colors.lightGreen,
warn => Colors.orange,
error => Colors.redAccent,
fatal => Colors.red,
panic => Colors.red,
};
}
@freezed
class BoxLog with _$BoxLog {
const factory BoxLog({
LogLevel? level,
DateTime? time,
required String message,
}) = _BoxLog;
factory BoxLog.parse(String log) {
log = log.strip();
DateTime? time;
if (log.length > 25) {
time = DateTime.tryParse(log.substring(6, 25));
}
if (time != null) {
log = log.substring(26);
}
final level = LogLevel.values.firstOrNullWhere(
(e) {
if (log.startsWith(e.name.toUpperCase())) {
log = log.removePrefix(e.name.toUpperCase());
return true;
}
return false;
},
);
return BoxLog(
level: level,
time: time,
message: log.trim(),
);
}
}