$entry){ $result[] = self::loadPermission($key, $entry, $default, $result); } return $result; } /** * @param string $name * @param array $data * @param string $default * @param array $output * * @return Permission * * @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"])){ $value = PermissionParser::defaultFromString($data["default"]); if($value !== null){ $default = $value; }else{ throw new \InvalidStateException("'default' key contained unknown value"); } } 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 * * @return array */ 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; } }