HookStep.parse constructor

HookStep.parse(
  1. dynamic raw,
  2. String label
)

Implementation

factory HookStep.parse(dynamic raw, String label) {
  if (raw is String) {
    if (raw.trim().isEmpty) {
      throw ArgumentError('$label command cannot be empty.');
    }
    return HookStep(command: raw.trim());
  }
  if (raw is! Map) {
    throw ArgumentError('$label must be a command string or a mapping.');
  }
  final map = Map<String, dynamic>.from(raw);
  final command = map['command']?.toString().trim() ?? '';
  if (command.isEmpty) throw ArgumentError("$label requires 'command'.");

  final rawArguments = map['arguments'] ?? map['args'];
  if (rawArguments != null && rawArguments is! List) {
    throw ArgumentError('$label.arguments must be a list.');
  }
  final rawEnvironment = map['environment'] ?? map['env'];
  if (rawEnvironment != null && rawEnvironment is! Map) {
    throw ArgumentError('$label.environment must be a mapping.');
  }

  return HookStep(
    command: command,
    arguments: [
      for (final value in (rawArguments as List?) ?? const [])
        value.toString(),
    ],
    workingDirectory: map['working-directory']?.toString(),
    environment: {
      for (final entry in (rawEnvironment as Map? ?? const {}).entries)
        entry.key.toString(): entry.value?.toString() ?? '',
    },
    timeout: map['timeout'] == null
        ? null
        : parseDuration(
            map['timeout'],
            label: '$label.timeout',
            allowZero: false,
          ),
    on: HookOn.parse(map['on']),
    continueOnError: _bool(
      map['continue-on-error'],
      '$label.continue-on-error',
    ),
  );
}