Add Endpoint::{IncomingRequest, IncomingResponse}

With these, it is no longer necessary to copy over the Endpoint trait's
where clauses whenever it is used as a bound
This commit is contained in:
Jonas Platte 2020-08-09 03:18:14 +02:00
parent ddb1b48e71
commit 9cf552f361
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
2 changed files with 16 additions and 18 deletions

View File

@ -303,6 +303,8 @@ impl ToTokens for Api {
impl #request_lifetimes ::ruma_api::Endpoint for Request #request_lifetimes {
type Response = Response;
type ResponseError = #error;
type IncomingRequest = <Self as ::ruma_api::Outgoing>::Incoming;
type IncomingResponse = <Response as ::ruma_api::Outgoing>::Incoming;
/// Metadata for the `#name` endpoint.
const METADATA: ::ruma_api::Metadata = ::ruma_api::Metadata {

View File

@ -245,19 +245,21 @@ pub trait EndpointError: Sized {
/// A Matrix API endpoint.
///
/// The type implementing this trait contains any data needed to make a request to the endpoint.
pub trait Endpoint: Outgoing
where
<Self as Outgoing>::Incoming: TryFrom<http::Request<Vec<u8>>, Error = FromHttpRequestError>,
<Self::Response as Outgoing>::Incoming: TryFrom<
http::Response<Vec<u8>>,
Error = FromHttpResponseError<<Self as Endpoint>::ResponseError>,
>,
{
pub trait Endpoint: Outgoing<Incoming = <Self as Endpoint>::IncomingRequest> {
/// Data returned in a successful response from the endpoint.
type Response: Outgoing + TryInto<http::Response<Vec<u8>>, Error = IntoHttpError>;
type Response: Outgoing<Incoming = Self::IncomingResponse>
+ TryInto<http::Response<Vec<u8>>, Error = IntoHttpError>;
/// Error type returned when response from endpoint fails.
type ResponseError: EndpointError;
/// Shorthand for `<Self as Outgoing>::Incoming`.
type IncomingRequest: TryFrom<http::Request<Vec<u8>>, Error = FromHttpRequestError>;
/// Shorthand for `<Self::Response as Outgoing>::Incoming`.
type IncomingResponse: TryFrom<
http::Response<Vec<u8>>,
Error = FromHttpResponseError<<Self as Endpoint>::ResponseError>,
>;
/// Metadata about the endpoint.
const METADATA: Metadata;
@ -280,15 +282,7 @@ where
///
/// This marker trait is to indicate that a type implementing `Endpoint` doesn't require any
/// authentication.
pub trait NonAuthEndpoint: Endpoint
where
<Self as Outgoing>::Incoming: TryFrom<http::Request<Vec<u8>>, Error = FromHttpRequestError>,
<Self::Response as Outgoing>::Incoming: TryFrom<
http::Response<Vec<u8>>,
Error = FromHttpResponseError<<Self as Endpoint>::ResponseError>,
>,
{
}
pub trait NonAuthEndpoint: Endpoint {}
/// Metadata about an API endpoint.
#[derive(Clone, Debug)]
@ -365,6 +359,8 @@ mod tests {
impl Endpoint for Request {
type Response = Response;
type ResponseError = Void;
type IncomingRequest = Self;
type IncomingResponse = Response;
const METADATA: Metadata = Metadata {
description: "Add an alias to a room.",