summaryrefslogtreecommitdiff
path: root/lib/services/log_service.dart
blob: f2f662c2708943ee90cbcc87b143b2e1c343a404 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import 'dart:io';

import 'package:intl/intl.dart';
import 'package:path/path.dart' as p;

class LogEntry {
  LogEntry({required this.file, required this.timestamp});
  final File file;
  final DateTime timestamp;
}

final _filenameRegex = RegExp(r'^ql-(\d{6})-(\d{6})\.md$');
final _timestampFormat = DateFormat('yyMMdd-HHmmss');

Future<File> logEntry(String dir, String text, {DateTime? now}) async {
  final stamp = _timestampFormat.format(now ?? DateTime.now());
  final file = File(p.join(dir, 'ql-$stamp.md'));
  await file.writeAsString(text);
  return file;
}

Future<List<LogEntry>> listEntries(String dir) async {
  final directory = Directory(dir);
  if (!await directory.exists()) return const [];
  final entries = <LogEntry>[];
  await for (final entity in directory.list(followLinks: false)) {
    if (entity is! File) continue;
    final ts = _parseFilename(p.basename(entity.path));
    if (ts == null) continue;
    entries.add(LogEntry(file: entity, timestamp: ts));
  }
  entries.sort((a, b) => b.timestamp.compareTo(a.timestamp));
  return entries;
}

Future<void> deleteEntry(File f) async {
  if (await f.exists()) await f.delete();
}

DateTime? _parseFilename(String name) {
  final m = _filenameRegex.firstMatch(name);
  if (m == null) return null;
  final d = m.group(1)!; // YYMMDD
  final t = m.group(2)!; // HHMMSS
  try {
    return DateTime(
      2000 + int.parse(d.substring(0, 2)),
      int.parse(d.substring(2, 4)),
      int.parse(d.substring(4, 6)),
      int.parse(t.substring(0, 2)),
      int.parse(t.substring(2, 4)),
      int.parse(t.substring(4, 6)),
    );
  } catch (_) {
    return null;
  }
}