> $data * * @return Permission[] */ public static function loadPermissions(array $data, string $default = Permission::DEFAULT_OP) : array{ $result = []; foreach($data as $key => $entry){ $result[] = self::loadPermission($key, $entry, $default, $result); } return $result; } /** * @param mixed[] $data * @param Permission[] $output reference parameter * @phpstan-param array $data * * @throws \Exception */ public static function loadPermission(string $name, array $data, string $default = Permission::DEFAULT_OP, array &$output = []) : Permission{ $desc = null; $children = []; if(isset($data["default"])){ $default = PermissionParser::defaultFromString($data["default"]); } if(isset($data["children"])){ if(is_array($data["children"])){ foreach($data["children"] as $k => $v){ if(is_array($v)){ if(($perm = self::loadPermission($k, $v, $default, $output)) !== null){ $output[] = $perm; } } $children[$k] = true; } }else{ throw new \InvalidStateException("'children' key is of wrong type"); } } if(isset($data["description"])){ $desc = $data["description"]; } return new Permission($name, $desc, $default, $children); } /** * @param Permission[] $permissions */ public static function emitPermissions(array $permissions) : array{ $result = []; foreach($permissions as $permission){ $result[$permission->getName()] = self::emitPermission($permission); } ksort($result); return $result; } private static function emitPermission(Permission $permission) : array{ $result = [ "description" => $permission->getDescription(), "default" => $permission->getDefault() ]; $children = []; foreach($permission->getChildren() as $name => $bool){ //TODO: really? wtf??? this system is so overengineered it makes my head hurt... $child = PermissionManager::getInstance()->getPermission($name); if($child === null){ throw new \UnexpectedValueException("Permission child should be a registered permission"); } $children[$name] = self::emitPermission($child); } if(!empty($children)){ ksort($children); $result["children"] = $children; } return $result; } }