|
@@ -98,7 +98,6 @@ trait ParsesValidationRules
|
|
|
$parameterData['description'] .= '.';
|
|
|
}
|
|
|
|
|
|
- $parameterData = $this->updateParameterExample($parameterData);
|
|
|
$parameters[$parameter] = $parameterData;
|
|
|
} catch (Throwable $e) {
|
|
|
if ($e instanceof ScribeException) {
|
|
@@ -484,26 +483,24 @@ trait ParsesValidationRules
|
|
|
return [strtolower(trim($rule)), $ruleArguments];
|
|
|
}
|
|
|
|
|
|
- protected function updateParameterExample(array $parameterData): array
|
|
|
+ protected function getParameterExample(array $parameterData)
|
|
|
{
|
|
|
// If no example was given by the user, set an autogenerated example.
|
|
|
// Each parsed rule returns a 'setter' function. We'll evaluate the last one.
|
|
|
- if ($parameterData['example'] === self::$MISSING_VALUE && isset($parameterData['setter'])) {
|
|
|
- $parameterData['example'] = $parameterData['setter']();
|
|
|
- }
|
|
|
-
|
|
|
if ($parameterData['example'] === self::$MISSING_VALUE) {
|
|
|
- $parameterData['example'] = $parameterData['required']
|
|
|
- ? $this->generateDummyValue($parameterData['type'])
|
|
|
- : null;
|
|
|
- }
|
|
|
-
|
|
|
- if (!is_null($parameterData['example']) && $parameterData['example'] !== self::$MISSING_VALUE) {
|
|
|
+ if (isset($parameterData['setter'])) {
|
|
|
+ return $parameterData['setter']();
|
|
|
+ } else {
|
|
|
+ return $parameterData['required']
|
|
|
+ ? $this->generateDummyValue($parameterData['type'])
|
|
|
+ : null;
|
|
|
+ }
|
|
|
+ } else if (!is_null($parameterData['example']) && $parameterData['example'] !== self::$MISSING_VALUE) {
|
|
|
// Casting again is important since values may have been cast to string in the validator
|
|
|
- $parameterData['example'] = $this->castToType($parameterData['example'], $parameterData['type']);
|
|
|
+ return $this->castToType($parameterData['example'], $parameterData['type']);
|
|
|
}
|
|
|
|
|
|
- return $parameterData;
|
|
|
+ return $parameterData['example'] === self::$MISSING_VALUE ? null : $parameterData['example'];
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -521,18 +518,20 @@ trait ParsesValidationRules
|
|
|
public function normaliseArrayAndObjectParameters(array $parametersFromValidationRules): array
|
|
|
{
|
|
|
$results = [];
|
|
|
+ $originalParams = $parametersFromValidationRules;
|
|
|
foreach ($parametersFromValidationRules as $name => $details) {
|
|
|
if (isset($results[$name])) {
|
|
|
continue;
|
|
|
}
|
|
|
if ($details['type'] === 'array') {
|
|
|
- // Generic array type. If a child item exists,
|
|
|
+ // This is the parent field, a generic array type. If a child item exists,
|
|
|
// this will be overwritten with the correct type (such as object or object[]) by the code below
|
|
|
$details['type'] = 'string[]';
|
|
|
}
|
|
|
|
|
|
if (Str::endsWith($name, '.*')) {
|
|
|
// Wrap array example properly
|
|
|
+ $details['example'] = $this->exampleOrDefault($details, $this->getParameterExample($details));
|
|
|
$needsWrapping = !is_array($details['example']);
|
|
|
|
|
|
$nestingLevel = 0;
|
|
@@ -541,14 +540,6 @@ trait ParsesValidationRules
|
|
|
$details['type'] .= '[]';
|
|
|
if ($needsWrapping) {
|
|
|
$details['example'] = [$details['example']];
|
|
|
- // Make it two items in each array
|
|
|
- if (isset($details['setter'])) {
|
|
|
- $secondArrayItem = $secondExampleValue = $details['setter']();
|
|
|
- for ($i = 0; $i < $nestingLevel; $i++) {
|
|
|
- $secondArrayItem = [$secondExampleValue];
|
|
|
- }
|
|
|
- $details['example'][] = $secondArrayItem;
|
|
|
- }
|
|
|
}
|
|
|
$name = substr($name, 0, -2);
|
|
|
$nestingLevel++;
|
|
@@ -580,19 +571,21 @@ trait ParsesValidationRules
|
|
|
// if the parent field already exists with a type 'array'
|
|
|
$parentDetails = $parametersFromValidationRules[$parentPath];
|
|
|
unset($parametersFromValidationRules[$parentPath]);
|
|
|
+
|
|
|
if (Str::endsWith($parentPath, '.*')) {
|
|
|
$parentPath = substr($parentPath, 0, -2);
|
|
|
$parentDetails['type'] = 'object[]';
|
|
|
// Set the example too. Very likely the example array was an array of strings or an empty array
|
|
|
- if (empty($parentDetails['example']) || is_string($parentDetails['example'][0]) || is_string($parentDetails['example'][0][0])) {
|
|
|
+ if (!$this->examplePresent($parentDetails) || is_string($parentDetails['example'][0]) || is_string($parentDetails['example'][0][0])) {
|
|
|
$parentDetails['example'] = [[]];
|
|
|
}
|
|
|
} else {
|
|
|
$parentDetails['type'] = 'object';
|
|
|
- if (empty($parentDetails['example']) || is_string($parentDetails['example'][0])) {
|
|
|
+ if (!$this->examplePresent($parentDetails) || is_string($parentDetails['example'][0])) {
|
|
|
$parentDetails['example'] = [];
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
$normalisedPath = str_replace('.*.', '[].', $parentPath);
|
|
|
$parentDetails['name'] = $normalisedPath;
|
|
|
$results[$normalisedPath] = $parentDetails;
|
|
@@ -600,7 +593,11 @@ trait ParsesValidationRules
|
|
|
}
|
|
|
|
|
|
$details['name'] = $name = str_replace('.*.', '[].', $name);
|
|
|
- unset($details['setter']);
|
|
|
+
|
|
|
+ // If an example was specified on the parent, use that instead.
|
|
|
+ if (isset($originalParams[$details['name']]) && $this->examplePresent($originalParams[$details['name']])) {
|
|
|
+ $details['example'] = $originalParams[$details['name']]['example'];
|
|
|
+ }
|
|
|
|
|
|
// Change type 'array' to 'object' if there are subfields
|
|
|
if (
|
|
@@ -611,6 +608,10 @@ trait ParsesValidationRules
|
|
|
) {
|
|
|
$details['type'] = 'object';
|
|
|
}
|
|
|
+
|
|
|
+ $details['example'] = $this->getParameterExample($details);
|
|
|
+ unset($details['setter']);
|
|
|
+
|
|
|
$results[$name] = $details;
|
|
|
|
|
|
}
|
|
@@ -618,6 +619,20 @@ trait ParsesValidationRules
|
|
|
return $results;
|
|
|
}
|
|
|
|
|
|
+ private function exampleOrDefault(array $parameterData, $default)
|
|
|
+ {
|
|
|
+ if (!isset($parameterData['example']) || $parameterData['example'] === self::$MISSING_VALUE) {
|
|
|
+ return $default;
|
|
|
+ }
|
|
|
+
|
|
|
+ return $parameterData['example'];
|
|
|
+ }
|
|
|
+
|
|
|
+ private function examplePresent(array $parameterData)
|
|
|
+ {
|
|
|
+ return isset($parameterData['example']) && $parameterData['example'] !== self::$MISSING_VALUE;
|
|
|
+ }
|
|
|
+
|
|
|
protected function getDescription(string $rule, array $arguments = [], $baseType = 'string'): string
|
|
|
{
|
|
|
$description = trans("validation.{$rule}");
|