2019-10-20 14:49:53 +00:00
|
|
|
use crate::{DrawResourceRoutes, RequestBody, ResourceResult, ResourceType};
|
2019-10-13 17:43:42 +02:00
|
|
|
use gotham::{
|
2020-04-06 16:20:08 +00:00
|
|
|
extractor::QueryStringExtractor,
|
2020-04-15 23:15:13 +02:00
|
|
|
hyper::Body,
|
2020-04-06 16:20:08 +00:00
|
|
|
state::State
|
2019-10-13 17:43:42 +02:00
|
|
|
};
|
2019-09-27 15:35:02 +02:00
|
|
|
use serde::de::DeserializeOwned;
|
2020-04-15 20:55:25 +02:00
|
|
|
use std::{
|
|
|
|
future::Future,
|
|
|
|
panic::RefUnwindSafe,
|
|
|
|
pin::Pin
|
|
|
|
};
|
2019-09-26 17:24:40 +02:00
|
|
|
|
2019-09-27 16:36:38 +02:00
|
|
|
/// This trait must be implemented by every RESTful Resource. It will
|
|
|
|
/// allow you to register the different methods for this Resource.
|
2019-09-26 17:24:40 +02:00
|
|
|
pub trait Resource
|
|
|
|
{
|
2019-09-30 20:10:51 +02:00
|
|
|
/// The name of this resource. Must be unique.
|
2019-09-30 19:19:06 +02:00
|
|
|
fn name() -> String;
|
2019-09-30 20:10:51 +02:00
|
|
|
|
|
|
|
/// Setup all routes of this resource. Take a look at the rest_resource!
|
|
|
|
/// macro if you don't feel like caring yourself.
|
2019-09-27 15:35:02 +02:00
|
|
|
fn setup<D : DrawResourceRoutes>(route : D);
|
2019-09-26 17:24:40 +02:00
|
|
|
}
|
|
|
|
|
2020-04-06 16:20:08 +00:00
|
|
|
pub trait ResourceMethod
|
|
|
|
{
|
2020-04-15 20:55:25 +02:00
|
|
|
type Res : ResourceResult + Send + 'static;
|
2020-04-07 20:44:02 +00:00
|
|
|
|
|
|
|
#[cfg(feature = "openapi")]
|
|
|
|
fn operation_id() -> Option<String>
|
|
|
|
{
|
|
|
|
None
|
|
|
|
}
|
2020-04-11 18:13:36 +00:00
|
|
|
|
|
|
|
fn wants_auth() -> bool
|
|
|
|
{
|
|
|
|
false
|
|
|
|
}
|
2020-04-06 16:20:08 +00:00
|
|
|
}
|
|
|
|
|
2019-09-27 16:36:38 +02:00
|
|
|
/// Handle a GET request on the Resource root.
|
2020-04-06 16:20:08 +00:00
|
|
|
pub trait ResourceReadAll : ResourceMethod
|
2019-09-26 17:24:40 +02:00
|
|
|
{
|
2020-04-15 21:07:33 +02:00
|
|
|
fn read_all(state : State) -> Pin<Box<dyn Future<Output = (State, Self::Res)> + Send>>;
|
2019-09-26 17:24:40 +02:00
|
|
|
}
|
|
|
|
|
2019-09-27 16:36:38 +02:00
|
|
|
/// Handle a GET request on the Resource with an id.
|
2020-04-06 16:20:08 +00:00
|
|
|
pub trait ResourceRead : ResourceMethod
|
2019-09-26 17:24:40 +02:00
|
|
|
{
|
2020-04-06 16:20:08 +00:00
|
|
|
type ID : DeserializeOwned + Clone + RefUnwindSafe + Send + Sync + 'static;
|
|
|
|
|
2020-04-15 21:07:33 +02:00
|
|
|
fn read(state : State, id : Self::ID) -> Pin<Box<dyn Future<Output = (State, Self::Res)> + Send>>;
|
2019-09-26 17:24:40 +02:00
|
|
|
}
|
|
|
|
|
2019-10-13 17:43:42 +02:00
|
|
|
/// Handle a GET request on the Resource with additional search parameters.
|
2020-04-06 16:20:08 +00:00
|
|
|
pub trait ResourceSearch : ResourceMethod
|
2019-10-13 17:43:42 +02:00
|
|
|
{
|
2020-04-06 16:20:08 +00:00
|
|
|
type Query : ResourceType + QueryStringExtractor<Body> + Sync;
|
|
|
|
|
2020-04-15 21:07:33 +02:00
|
|
|
fn search(state : State, query : Self::Query) -> Pin<Box<dyn Future<Output = (State, Self::Res)> + Send>>;
|
2019-10-13 17:43:42 +02:00
|
|
|
}
|
|
|
|
|
2019-09-27 16:36:38 +02:00
|
|
|
/// Handle a POST request on the Resource root.
|
2020-04-06 16:20:08 +00:00
|
|
|
pub trait ResourceCreate : ResourceMethod
|
2019-09-26 17:24:40 +02:00
|
|
|
{
|
2020-04-06 16:20:08 +00:00
|
|
|
type Body : RequestBody;
|
|
|
|
|
2020-04-15 21:07:33 +02:00
|
|
|
fn create(state : State, body : Self::Body) -> Pin<Box<dyn Future<Output = (State, Self::Res)> + Send>>;
|
2019-09-26 17:24:40 +02:00
|
|
|
}
|
2019-09-27 21:33:24 +02:00
|
|
|
|
|
|
|
/// Handle a PUT request on the Resource root.
|
2020-04-06 16:20:08 +00:00
|
|
|
pub trait ResourceUpdateAll : ResourceMethod
|
2019-09-27 21:33:24 +02:00
|
|
|
{
|
2020-04-06 16:20:08 +00:00
|
|
|
type Body : RequestBody;
|
|
|
|
|
2020-04-15 21:07:33 +02:00
|
|
|
fn update_all(state : State, body : Self::Body) -> Pin<Box<dyn Future<Output = (State, Self::Res)> + Send>>;
|
2019-09-27 21:33:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Handle a PUT request on the Resource with an id.
|
2020-04-06 16:20:08 +00:00
|
|
|
pub trait ResourceUpdate : ResourceMethod
|
2019-09-27 21:33:24 +02:00
|
|
|
{
|
2020-04-06 16:20:08 +00:00
|
|
|
type Body : RequestBody;
|
|
|
|
type ID : DeserializeOwned + Clone + RefUnwindSafe + Send + Sync + 'static;
|
|
|
|
|
2020-04-15 21:07:33 +02:00
|
|
|
fn update(state : State, id : Self::ID, body : Self::Body) -> Pin<Box<dyn Future<Output = (State, Self::Res)> + Send>>;
|
2019-09-27 21:33:24 +02:00
|
|
|
}
|
2019-09-29 19:19:38 +02:00
|
|
|
|
|
|
|
/// Handle a DELETE request on the Resource root.
|
2020-04-06 16:20:08 +00:00
|
|
|
pub trait ResourceDeleteAll : ResourceMethod
|
2019-09-29 19:19:38 +02:00
|
|
|
{
|
2020-04-15 21:07:33 +02:00
|
|
|
fn delete_all(state : State) -> Pin<Box<dyn Future<Output = (State, Self::Res)> + Send>>;
|
2019-09-29 19:19:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Handle a DELETE request on the Resource with an id.
|
2020-04-06 16:20:08 +00:00
|
|
|
pub trait ResourceDelete : ResourceMethod
|
2019-09-29 19:19:38 +02:00
|
|
|
{
|
2020-04-06 16:20:08 +00:00
|
|
|
type ID : DeserializeOwned + Clone + RefUnwindSafe + Send + Sync + 'static;
|
|
|
|
|
2020-04-15 21:07:33 +02:00
|
|
|
fn delete(state : State, id : Self::ID) -> Pin<Box<dyn Future<Output = (State, Self::Res)> + Send>>;
|
2019-09-29 19:19:38 +02:00
|
|
|
}
|