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}