diff --git a/lib/data/model/container/image.dart b/lib/data/model/container/image.dart index ade7f82e..bdea4e2e 100644 --- a/lib/data/model/container/image.dart +++ b/lib/data/model/container/image.dart @@ -72,7 +72,7 @@ final class DockerImg implements ContainerImg { final String repository; final String size; @override - final String tag; + final String? tag; DockerImg({ required this.containers, @@ -95,14 +95,30 @@ final class DockerImg implements ContainerImg { String toRawJson() => json.encode(toJson()); - factory DockerImg.fromJson(Map json) => DockerImg( - containers: json["Containers"], + 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"], - repository: json["Repository"], - size: json["Size"], + id: json["ID"] ?? json["Id"] ?? '', + repository: repo, + size: size, tag: json["Tag"], ); + } Map toJson() => { "Containers": containers, diff --git a/lib/data/provider/container.dart b/lib/data/provider/container.dart index 39344c7e..2e9ec125 100644 --- a/lib/data/provider/container.dart +++ b/lib/data/provider/container.dart @@ -160,11 +160,18 @@ class ContainerProvider extends ChangeNotifier { } // Parse images - final imageRaw = ContainerCmdType.images.find(segments); + final imageRaw = ContainerCmdType.images.find(segments).trim(); + final isEntireJson = imageRaw.startsWith('[') && imageRaw.endsWith(']'); try { - final imgLines = imageRaw.split('\n'); - imgLines.removeWhere((element) => element.isEmpty); - images = imgLines.map((e) => ContainerImg.fromRawJson(e, type)).toList(); + if (isEntireJson) { + images = (json.decode(imageRaw) as List) + .map((e) => ContainerImg.fromRawJson(json.encode(e), type)) + .toList(); + } else { + final lines = imageRaw.split('\n'); + lines.removeWhere((element) => element.isEmpty); + images = lines.map((e) => ContainerImg.fromRawJson(e, type)).toList(); + } } catch (e, trace) { error = ContainerErr( type: ContainerErrType.parseImages, @@ -298,6 +305,6 @@ enum ContainerCmdType { }) { return ContainerCmdType.values .map((e) => e.exec(type, sudo: sudo, includeStats: includeStats)) - .join(' && echo ${ShellFunc.seperator} && '); + .join('\necho ${ShellFunc.seperator}\n'); } }