stellation_backend/
props.rs

1use std::marker::PhantomData;
2use std::rc::Rc;
3
4use http::HeaderMap;
5use serde::{Deserialize, Serialize};
6use yew::Properties;
7
8use crate::error::ServerAppResult;
9use crate::Request;
10
11/// The Properties provided to a server app.
12#[derive(Properties, Debug)]
13pub struct ServerAppProps<CTX, REQ> {
14    request: Rc<REQ>,
15    _marker: PhantomData<CTX>,
16}
17
18impl<CTX, REQ> ServerAppProps<CTX, REQ>
19where
20    REQ: Request<Context = CTX>,
21{
22    /// Returns the path of current request.
23    pub fn path(&self) -> &str {
24        self.request.path()
25    }
26
27    /// Returns queries of current request.
28    pub fn queries<Q>(&self) -> ServerAppResult<Q>
29    where
30        Q: Serialize + for<'de> Deserialize<'de>,
31    {
32        self.request.queries()
33    }
34
35    /// Returns queries as a raw string.
36    pub fn raw_queries(&self) -> &str {
37        self.request.raw_queries()
38    }
39
40    /// Returns request headers.
41    pub fn headers(&self) -> &HeaderMap {
42        self.request.headers()
43    }
44
45    /// Returns the current request context.
46    pub fn context(&self) -> &CTX {
47        self.request.context()
48    }
49
50    pub(crate) fn from_request(request: Rc<REQ>) -> Self {
51        Self {
52            request,
53            _marker: PhantomData,
54        }
55    }
56}
57
58impl<REQ, CTX> PartialEq for ServerAppProps<REQ, CTX> {
59    fn eq(&self, other: &Self) -> bool {
60        Rc::ptr_eq(&self.request, &other.request)
61    }
62}
63
64impl<REQ, CTX> Clone for ServerAppProps<REQ, CTX> {
65    fn clone(&self) -> Self {
66        Self {
67            request: self.request.clone(),
68            _marker: PhantomData,
69        }
70    }
71}