yx_icon_fonts_flutter/lib/src/config/config_loader.dart

104 lines
2.9 KiB
Dart

import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:yaml/yaml.dart';
import 'package:yx_icon_fonts/src/config/generator_config.dart';
/// 配置加载器
///
/// 负责从 YAML 文件加载配置
class ConfigLoader {
/// 默认配置文件名
static const String defaultConfigFileName = 'icon_generator_config.yaml';
/// 加载配置文件
///
/// [configPath] 配置文件路径,如果为 null 则使用默认路径
/// [workingDir] 工作目录,默认为当前目录
static GeneratorConfig load({
String? configPath,
String? workingDir,
}) {
final directory = workingDir ?? Directory.current.path;
final filePath = configPath ?? path.join(directory, defaultConfigFileName);
final file = File(filePath);
if (!file.existsSync()) {
throw ConfigNotFoundException(
'配置文件不存在: $filePath\n'
'请运行 "dart run yx_icon_fonts init" 创建配置文件',
);
}
try {
final content = file.readAsStringSync();
final yamlMap = loadYaml(content) as YamlMap?;
if (yamlMap == null) {
throw ConfigParseException('配置文件为空或格式错误');
}
// 将 YamlMap 转换为 Map<String, dynamic>
final map = _convertYamlMap(yamlMap);
return GeneratorConfig.fromMap(map);
} on YamlException catch (e) {
throw ConfigParseException('YAML 解析错误: ${e.message}');
}
}
/// 检查配置文件是否存在
static bool exists({String? configPath, String? workingDir}) {
final directory = workingDir ?? Directory.current.path;
final filePath = configPath ?? path.join(directory, defaultConfigFileName);
return File(filePath).existsSync();
}
/// 将 YamlMap 递归转换为 Map<String, dynamic>
static Map<String, dynamic> _convertYamlMap(YamlMap yamlMap) {
final result = <String, dynamic>{};
for (final key in yamlMap.keys) {
final value = yamlMap[key];
if (value is YamlMap) {
result[key.toString()] = _convertYamlMap(value);
} else if (value is YamlList) {
result[key.toString()] = _convertYamlList(value);
} else {
result[key.toString()] = value;
}
}
return result;
}
/// 将 YamlList 递归转换为 List<dynamic>
static List<dynamic> _convertYamlList(YamlList yamlList) {
return yamlList.map((item) {
if (item is YamlMap) {
return _convertYamlMap(item);
} else if (item is YamlList) {
return _convertYamlList(item);
}
return item;
}).toList();
}
}
/// 配置文件未找到异常
class ConfigNotFoundException implements Exception {
ConfigNotFoundException(this.message);
final String message;
@override
String toString() => 'ConfigNotFoundException: $message';
}
/// 配置解析异常
class ConfigParseException implements Exception {
ConfigParseException(this.message);
final String message;
@override
String toString() => 'ConfigParseException: $message';
}