> $request */ public function read( WP_REST_Request $request ): LinkListQuery|WP_Error { try { return $this->query_from( $request ); } catch ( InvalidArgumentException | ValueError ) { return new WP_Error( self::INVALID_PARAMETER, __( 'The list was asked for with a value that is not allowed.', 'aiplaz-link-checkup' ), array( 'status' => self::BAD_REQUEST_STATUS ) ); } } /** @param WP_REST_Request> $request */ private function query_from( WP_REST_Request $request ): LinkListQuery { $status = $this->text_param( $request, self::STATUS_PARAMETER, LinkStatusFilter::Problems->value ); $search = $this->text_param( $request, self::SEARCH_PARAMETER, '' ); $field = $this->text_param( $request, self::ORDERBY_PARAMETER, LinkSortField::Priority->value ); $order = $this->text_param( $request, self::ORDER_PARAMETER, SortDirection::Descending->value ); return new LinkListQuery( status: LinkStatusFilter::from( $status ), search: trim( $search ), sort_field: LinkSortField::from( $field ), sort_direction: SortDirection::from( $order ), page_request: PageRequest::from_request( $request, self::DEFAULT_PER_PAGE ) ); } /** @param WP_REST_Request> $request */ private function text_param( WP_REST_Request $request, string $name, string $default_text ): string { $value = $request->get_param( $name ); if ( null === $value ) { return $default_text; } if ( ! is_string( $value ) ) { throw new InvalidArgumentException(); } return $value; } }