HookStep.parse constructor
HookStep.parse(
- dynamic raw,
- 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',
),
);
}