use crate::{DrawResourceRoutes, RequestBody, ResourceID, ResourceResult, ResourceType}; use gotham::{extractor::QueryStringExtractor, hyper::Body, state::State}; use std::{future::Future, pin::Pin}; /// This trait must be implemented for every resource. It allows you to register the different /// methods that can be handled by this resource to be registered with the underlying router. /// /// It is not recommended to implement this yourself, rather just use `#[derive(Resource)]`. pub trait Resource { /// Register all methods handled by this resource with the underlying router. fn setup(route: D); } /// A common trait for every resource method. It defines the return type as well as some general /// information about a resource method. /// /// It is not recommended to implement this yourself. Rather, just write your handler method and /// annotate it with `#[(YourResource)]`, where `` is one of the supported /// resource methods. pub trait ResourceMethod { type Res: ResourceResult + Send + 'static; #[cfg(feature = "openapi")] fn operation_id() -> Option { None } fn wants_auth() -> bool { false } } /// The read_all [`ResourceMethod`](trait.ResourceMethod.html). pub trait ResourceReadAll: ResourceMethod { /// Handle a GET request on the Resource root. fn read_all(state: State) -> Pin + Send>>; } /// The read [`ResourceMethod`](trait.ResourceMethod.html). pub trait ResourceRead: ResourceMethod { /// The ID type to be parsed from the request path. type ID: ResourceID + 'static; /// Handle a GET request on the Resource with an id. fn read(state: State, id: Self::ID) -> Pin + Send>>; } /// The search [`ResourceMethod`](trait.ResourceMethod.html). pub trait ResourceSearch: ResourceMethod { /// The Query type to be parsed from the request parameters. type Query: ResourceType + QueryStringExtractor + Sync; /// Handle a GET request on the Resource with additional search parameters. fn search(state: State, query: Self::Query) -> Pin + Send>>; } /// The create [`ResourceMethod`](trait.ResourceMethod.html). pub trait ResourceCreate: ResourceMethod { /// The Body type to be parsed from the request body. type Body: RequestBody; /// Handle a POST request on the Resource root. fn create(state: State, body: Self::Body) -> Pin + Send>>; } /// The change_all [`ResourceMethod`](trait.ResourceMethod.html). pub trait ResourceChangeAll: ResourceMethod { /// The Body type to be parsed from the request body. type Body: RequestBody; /// Handle a PUT request on the Resource root. fn change_all(state: State, body: Self::Body) -> Pin + Send>>; } /// The change [`ResourceMethod`](trait.ResourceMethod.html). pub trait ResourceChange: ResourceMethod { /// The Body type to be parsed from the request body. type Body: RequestBody; /// The ID type to be parsed from the request path. type ID: ResourceID + 'static; /// Handle a PUT request on the Resource with an id. fn change(state: State, id: Self::ID, body: Self::Body) -> Pin + Send>>; } /// The remove_all [`ResourceMethod`](trait.ResourceMethod.html). pub trait ResourceRemoveAll: ResourceMethod { /// Handle a DELETE request on the Resource root. fn remove_all(state: State) -> Pin + Send>>; } /// The remove [`ResourceMethod`](trait.ResourceMethod.html). pub trait ResourceRemove: ResourceMethod { /// The ID type to be parsed from the request path. type ID: ResourceID + 'static; /// Handle a DELETE request on the Resource with an id. fn remove(state: State, id: Self::ID) -> Pin + Send>>; }