krustie/router/endpoint.rs
1use crate::{HttpMethod, Middleware};
2
3use super::Controller;
4
5#[doc = include_str!("../../docs/core/endpoint.md")]
6#[derive(Debug)]
7pub struct Endpoint {
8 method: HttpMethod,
9 controller: Controller,
10 middlewares: Vec<Box<dyn Middleware>>,
11}
12
13impl Endpoint {
14 /// Creates a new Endpoint instance
15 ///
16 /// # Example
17 ///
18 /// ```rust
19 /// use krustie::{ Endpoint, HttpMethod, Request, Response, StatusCode };
20 ///
21 /// fn get(req: &Request, res: &mut Response) {
22 /// res.status(StatusCode::Ok).body_text("Hello, World!");
23 /// }
24 ///
25 /// let endpoint = Endpoint::new(HttpMethod::GET, get);
26 /// ```
27 pub fn new(method: HttpMethod, controller: Controller) -> Self {
28 Self {
29 method,
30 controller,
31 middlewares: Vec::new(),
32 }
33 }
34
35 /// Creates a new Endpoint instance with middleware
36 ///
37 /// # Example
38 ///
39 /// ```rust
40 /// use krustie::{ Endpoint, HttpMethod, Request, Response, Router, StatusCode, Middleware, HandlerResult };
41 ///
42 /// let mut router = Router::new();
43 ///
44 /// fn get(req: &Request, res: &mut Response) {
45 /// res.status(StatusCode::Ok).body_text("Hello, World!");
46 /// }
47 ///
48 /// #[derive(Clone)]
49 /// struct MyMiddleware;
50 ///
51 /// impl Middleware for MyMiddleware {
52 /// fn middleware(&mut self, req: &Request, res: &mut Response) -> HandlerResult {
53 /// HandlerResult::Next
54 /// }
55 /// }
56 ///
57 /// let endpoint = Endpoint::new_with_middleware(HttpMethod::GET, get, vec![Box::new(MyMiddleware)]);
58 ///
59 /// router.use_endpoint("/", endpoint);
60 /// ```
61 pub fn new_with_middleware(
62 method: HttpMethod,
63 controller: Controller,
64 middlewares: Vec<Box<dyn Middleware>>,
65 ) -> Self {
66 Self {
67 method,
68 controller,
69 middlewares,
70 }
71 }
72
73 pub(crate) fn is_method(&self, method: &HttpMethod) -> bool {
74 self.method == *method
75 }
76
77 pub(crate) fn get_controller(&self) -> &Controller {
78 &self.controller
79 }
80
81 pub(crate) fn get_middlewares(&mut self) -> &mut Vec<Box<dyn Middleware>> {
82 &mut self.middlewares
83 }
84}
85
86impl Clone for Endpoint {
87 fn clone(&self) -> Self {
88 Self {
89 method: self.method.clone(),
90 controller: self.controller.clone(),
91 middlewares: self.middlewares.clone(),
92 }
93 }
94}