import 'dart:convert'; import 'package:fl_lib/fl_lib.dart'; import 'package:server_box/data/model/container/type.dart'; abstract final class ContainerImg { final String? repository = null; final String? tag = null; final String? id = null; String? get sizeMB; int? get containersCount; factory ContainerImg.fromRawJson(String s, ContainerType typ) => typ.img(s); } final class PodmanImg implements ContainerImg { @override final String? repository; @override final String? tag; @override final String? id; final int? created; final int? size; final int? containers; PodmanImg({ this.repository, this.tag, this.id, this.created, this.size, this.containers, }); @override String? get sizeMB => size?.bytes2Str; @override int? get containersCount => containers; factory PodmanImg.fromRawJson(String str) => PodmanImg.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); factory PodmanImg.fromJson(Map json) => PodmanImg( repository: json["repository"], tag: json["tag"], id: json["Id"], created: json["Created"], size: json["Size"], containers: json["Containers"], ); Map toJson() => { "repository": repository, "tag": tag, "Id": id, "Created": created, "Size": size, "Containers": containers, }; } final class DockerImg implements ContainerImg { final String containers; final String createdAt; @override final String id; @override final String repository; final String size; @override final String? tag; DockerImg({ required this.containers, required this.createdAt, required this.id, required this.repository, required this.size, required this.tag, }); @override String? get sizeMB => size; @override int? get containersCount => containers == 'N/A' ? 0 : int.tryParse(containers); factory DockerImg.fromRawJson(String str) => DockerImg.fromJson(json.decode(str)); String toRawJson() => json.encode(toJson()); factory DockerImg.fromJson(Map json) { final containers = switch (json["Containers"]) { final String a => a, final Object? a => a.toString(), }; final repo = switch (json["Repository"] ?? json["Names"]) { final String a => a, final List a => a.firstOrNull.toString(), final Object? a => a.toString(), }; final size = switch (json["Size"]) { final String a => a, final int a => a.bytes2Str, final Object? a => a.toString(), }; return DockerImg( containers: containers, createdAt: json["CreatedAt"], id: json["ID"] ?? json["Id"] ?? '', repository: repo, size: size, tag: json["Tag"], ); } Map toJson() => { "Containers": containers, "CreatedAt": createdAt, "ID": id, "Repository": repository, "Size": size, "Tag": tag, }; }