1use serde::{Deserialize, Serialize};
2
3use crate::{HandleParams, Handler, NamedRequest, RequestHandler, Result};
4
5#[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}