DockerContainerState.fromJson constructor

DockerContainerState.fromJson(
  1. Map<String, Object?> json
)

Reads the answer of GET /containers/{id}/json.

Implementation

factory DockerContainerState.fromJson(Map<String, Object?> json) {
  final state = (json['State'] as Map<String, Object?>?) ?? const {};
  final health = state['Health'] as Map<String, Object?>?;
  final network = json['NetworkSettings'] as Map<String, Object?>?;
  final published = (network?['Ports'] as Map<String, Object?>?) ?? const {};
  final config = json['Config'] as Map<String, Object?>?;
  final ports = <String, int>{};
  for (final MapEntry(:key, :value) in published.entries) {
    final bindings = value as List<Object?>?;
    for (final binding in bindings ?? const <Object?>[]) {
      final port = int.tryParse(
        '${(binding! as Map<String, Object?>)['HostPort']}',
      );
      if (port != null) {
        ports.putIfAbsent(key, () => port);
      }
    }
  }
  return DockerContainerState(
    id: '${json['Id']}',
    running: state['Running'] == true,
    status: '${state['Status']}',
    exitCode: (state['ExitCode'] as num?)?.toInt() ?? 0,
    health: health == null ? null : '${health['Status']}',
    ports: ports,
    labels: {
      for (final e
          in ((config?['Labels'] as Map<String, Object?>?) ?? const {})
              .entries)
        e.key: '${e.value}',
    },
    error: '${state['Error'] ?? ''}',
  );
}