72 lines
1.9 KiB
Dart
72 lines
1.9 KiB
Dart
import 'dart:convert';
|
|
import 'dart:io';
|
|
|
|
import 'package:logger/logger.dart';
|
|
|
|
import '../domain/models.dart';
|
|
import '../services/app_paths.dart';
|
|
|
|
class ConfigRepository {
|
|
ConfigRepository(this._configFile, this._logger);
|
|
|
|
final File _configFile;
|
|
final Logger _logger;
|
|
|
|
static Future<ConfigRepository> create(Logger logger) async {
|
|
final configFile = await AppPaths.configFile();
|
|
return ConfigRepository(configFile, logger);
|
|
}
|
|
|
|
File get configFile => _configFile;
|
|
|
|
Future<AppConfig> loadConfig() async {
|
|
if (await _configFile.exists()) {
|
|
return _readConfigFile(_configFile);
|
|
}
|
|
|
|
for (final legacyFile in await AppPaths.legacyConfigFiles()) {
|
|
if (!await legacyFile.exists()) {
|
|
continue;
|
|
}
|
|
final config = await _readConfigFile(legacyFile);
|
|
await saveConfig(config);
|
|
return config;
|
|
}
|
|
|
|
_logger.i('Config not found, using defaults.');
|
|
return AppConfig.defaults();
|
|
}
|
|
|
|
Future<void> saveConfig(AppConfig config) async {
|
|
try {
|
|
await _configFile.writeAsString(AppConfig.prettyPrint(config));
|
|
_logger.i('Config saved to ${_configFile.path}');
|
|
} catch (error, stack) {
|
|
_logger.e('Failed to save config', error: error, stackTrace: stack);
|
|
}
|
|
}
|
|
|
|
Map<String, dynamic> _decode(String raw) {
|
|
final json = raw.trim().isEmpty ? '{}' : raw;
|
|
return json.isEmpty
|
|
? <String, dynamic>{}
|
|
: (jsonDecode(json) as Map<String, dynamic>);
|
|
}
|
|
|
|
Future<AppConfig> _readConfigFile(File file) async {
|
|
try {
|
|
final contents = await file.readAsString();
|
|
final config = AppConfig.fromJson(_decode(contents));
|
|
_logger.i('Loaded config from ${file.path}');
|
|
return config;
|
|
} catch (error, stack) {
|
|
_logger.e(
|
|
'Failed to load config from ${file.path}, using defaults.',
|
|
error: error,
|
|
stackTrace: stack,
|
|
);
|
|
return AppConfig.defaults();
|
|
}
|
|
}
|
|
}
|