Files
sm-emby-share/lib/core/contracts/icon_library.dart
T
2026-07-14 11:11:36 +08:00

50 lines
1.4 KiB
Dart

import 'package:freezed_annotation/freezed_annotation.dart';
part 'icon_library.freezed.dart';
part 'icon_library.g.dart';
@freezed
abstract class IconEntry with _$IconEntry {
const factory IconEntry({
@JsonKey(fromJson: _stringOrEmpty) @Default('') String name,
@JsonKey(fromJson: _stringOrEmpty) @Default('') String url,
}) = _IconEntry;
factory IconEntry.fromJson(Map<String, dynamic> json) =>
_$IconEntryFromJson(json);
}
@freezed
abstract class IconLibrary with _$IconLibrary {
const factory IconLibrary({
required String sourceUrl,
@JsonKey(fromJson: _stringOrEmpty) @Default('') String name,
@JsonKey(fromJson: _stringOrEmpty) @Default('') String description,
@Default(<IconEntry>[]) List<IconEntry> icons,
}) = _IconLibrary;
factory IconLibrary.fromJson(Map<String, dynamic> json) =>
_$IconLibraryFromJson(json);
static IconLibrary parse(String sourceUrl, Map<String, dynamic> json) {
final raw = json['icons'];
final iconsList = raw is List
? raw
.whereType<Map<String, dynamic>>()
.map(IconEntry.fromJson)
.where((e) => e.url.isNotEmpty)
.toList()
: const <IconEntry>[];
return IconLibrary(
sourceUrl: sourceUrl,
name: (json['name'] as String?) ?? '',
description: (json['description'] as String?) ?? '',
icons: iconsList,
);
}
}
String _stringOrEmpty(Object? value) => value?.toString() ?? '';