-
Notifications
You must be signed in to change notification settings - Fork 83
Open
Description
Instead of Issue #86, perhaps it makes more sense to implement a transform
method that handles both validation and value mapping.
I have certain options that accept simple json strings as values, for example. These will require both a transformation from string to php array, and also certain object-specific validations.
To handle this well, I'll need the ability to deliver fine-grained error messages and also the ability to parse the value only once, rather than parsing the value for validation, then parsing again for mapping.
Here's how I see this working:
$cmd->option("t")
->require()
->transform(function($val) {
$val = json_decode($val, true);
if (!$val) {
throw new OptionValidationException("You must provide a valid json-encoded object for option 't'");
}
$errors = [];
if (empty($val['prop1']) || !is_string($val['prop1'])) {
$errors[] = "`prop1` of option 't' must be a string";
}
if (empty($val['prop2']) || !preg_match("/^[a-fA-F0-9-]{32,36}$/", $val['prop2'])) {
$errors[] = "`prop2` of option 't' must be a valid GUID or UUID"
}
if (!empty($errors)) {
$e = new OptionValidationException("");
$e->setOptionValidationErrors($errors);
throw $e;
}
if (empty($val['prop3'])) {
$val['prop3'] = 0;
} elseif (!is_int($val['prop3'])) {
$val['prop3'] = (int)$val['prop3'];
}
// Return the transformed value for the option
return $val;
});
Metadata
Metadata
Assignees
Labels
No labels