items = $items; $this->castTo = 'object'; $this->required = true; } public function default($value): self { throw new Nette\InvalidStateException('Structure cannot have default value.'); } public function min(?int $min): self { $this->range[0] = $min; return $this; } public function max(?int $max): self { $this->range[1] = $max; return $this; } /** * @param string|Schema $type */ public function otherItems($type = 'mixed'): self { $this->otherItems = $type instanceof Schema ? $type : new Type($type); return $this; } public function skipDefaults(bool $state = true): self { $this->skipDefaults = $state; return $this; } public function normalize($value, Context $context) { if ($prevent = (is_array($value) && isset($value[Helpers::PreventMerging]))) { unset($value[Helpers::PreventMerging]); } $value = $this->doNormalize($value, $context); if (is_object($value)) { $value = (array) $value; } if (is_array($value)) { foreach ($value as $key => $val) { $itemSchema = $this->items[$key] ?? $this->otherItems; if ($itemSchema) { $context->path[] = $key; $value[$key] = $itemSchema->normalize($val, $context); array_pop($context->path); } } if ($prevent) { $value[Helpers::PreventMerging] = true; } } return $value; } public function merge($value, $base) { if (is_array($value) && isset($value[Helpers::PreventMerging])) { unset($value[Helpers::PreventMerging]); $base = null; } if (is_array($value) && is_array($base)) { $index = 0; foreach ($value as $key => $val) { if ($key === $index) { $base[] = $val; $index++; } elseif (array_key_exists($key, $base)) { $itemSchema = $this->items[$key] ?? $this->otherItems; $base[$key] = $itemSchema ? $itemSchema->merge($val, $base[$key]) : Helpers::merge($val, $base[$key]); } else { $base[$key] = $val; } } return $base; } return Helpers::merge($value, $base); } public function complete($value, Context $context) { if ($value === null) { $value = []; // is unable to distinguish null from array in NEON } $this->doDeprecation($context); if (!$this->doValidate($value, 'array', $context) || !$this->doValidateRange($value, $this->range, $context) ) { return; } $errCount = count($context->errors); $items = $this->items; if ($extraKeys = array_keys(array_diff_key($value, $items))) { if ($this->otherItems) { $items += array_fill_keys($extraKeys, $this->otherItems); } else { $keys = array_map('strval', array_keys($items)); foreach ($extraKeys as $key) { $hint = Nette\Utils\ObjectHelpers::getSuggestion($keys, (string) $key); $context->addError( 'Unexpected item %path%' . ($hint ? ", did you mean '%hint%'?" : '.'), Nette\Schema\Message::UnexpectedItem, ['hint' => $hint] )->path[] = $key; } } } foreach ($items as $itemKey => $itemVal) { $context->path[] = $itemKey; if (array_key_exists($itemKey, $value)) { $value[$itemKey] = $itemVal->complete($value[$itemKey], $context); } else { $default = $itemVal->completeDefault($context); // checks required item if (!$context->skipDefaults && !$this->skipDefaults) { $value[$itemKey] = $default; } } array_pop($context->path); } if (count($context->errors) > $errCount) { return; } return $this->doFinalize($value, $context); } public function completeDefault(Context $context) { return $this->required ? $this->complete([], $context) : null; } } __halt_compiler();----SIGNATURE:----wfhbPUQqWeBh3vM6/yqnlgQoEj7tQkYXwnkxJz+9I9qLumye6uOeD23XYnY0Bf0Tl5LZuGcT309WR7+prXqIRs7WvNfrKOdIXEgxDuaf1aw24i1BLZ270IYnHgqhP9a5NsMTtc59cTKX+CFImF3eRdcA9lR+3yEURziSUJRybwLamefW2FLFKZgeq1s1olgbewMyBulYR2O7wZYX71X5wbIZfOesZrFRn40A2w9pKycud0wBZauZErOao9fyazPU2viYyln98UFuDpZ5vFexDlojgecaQ5hxBYZpiFCWlffeM/EUTSWAaUtzBcVHxrMZ8A/hkeCK5IU/HmCs2vUUBQPeMK2Ojga8FzOTRpVPTA3NtIpW+4Ypvn30c7m2BKH4K+L0O5c5vTkBo1bLDKNImI0e1EIKkoRVo0NkAsAh+tFeLSmPVnrLyZB9Fj6GZ6V3AZkhHLTCyg/AqJeqviqkA8Q9r/Gp4Sx6CF7pf3K/eTHbQ3Mg+Al7oSpU1hiDcd4vPeUKH03cQjBEE3X6A2Yh8NBMtJIxrVU2tZlmrnkklXDaU0sf/5fKlx3k3hDe5+cfDbXgAgMGux3u+CBzyZ2pGrClYRse8NE4/JOopK0+GAjz2T8VSUaBci+hboMiyAglW3WV3I0V68Y61zVMrb2k/8ZDeOr3sU+yRBmGJRr3/f8=----ATTACHMENT:----NTExMjY5MzUzNjgxMzcyNiAxODI4NjIzODg4MzQyOTg2IDc4NDEwMTI3NTg0MzUxMjg=