lenra_app/
resource.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{HandleParams, Handler, NamedRequest, RequestHandler, Result};
4
5/** Lenra view request */
6#[derive(Serialize, Deserialize, Debug, PartialEq)]
7pub struct ResourceRequest {
8    pub resource: String,
9}
10
11impl NamedRequest for ResourceRequest {
12    fn name(&self) -> String {
13        self.resource.clone()
14    }
15}
16
17pub struct ResourceParams;
18
19impl HandleParams<ResourceRequest> for ResourceParams {
20    fn from_request(_request: ResourceRequest) -> Self {
21        ResourceParams
22    }
23}
24
25pub struct Resource {
26    name: String,
27    build_fn: Box<dyn Fn(ResourceRequest) -> Result<Vec<u8>>>,
28}
29
30impl RequestHandler<ResourceRequest, Vec<u8>> for Resource {
31    fn name(&self) -> String {
32        self.name.clone()
33    }
34
35    fn handle(&self, request: ResourceRequest) -> Result<Vec<u8>> {
36        (self.build_fn)(request)
37    }
38
39    fn create(name: &str, build_fn: Box<dyn Fn(ResourceRequest) -> Result<Vec<u8>>>) -> Self {
40        Resource {
41            name: name.to_string(),
42            build_fn,
43        }
44    }
45}
46
47impl Handler<ResourceRequest, Vec<u8>> for Resource {}
48
49pub fn map_resources<const N: usize>(resources: [(&str, &[u8]); N]) -> Vec<Resource> {
50    let mut ret = vec![];
51    resources.iter().for_each(|res| ret.push(map_resource(res)));
52    ret
53}
54
55fn map_resource(&resource: &(&str, &[u8])) -> Resource {
56    let (name, bytes) = resource;
57    let vec = bytes.to_vec();
58    Resource::create(
59        name,
60        Box::new(move |_request: ResourceRequest| Ok(vec.clone())),
61    )
62}