starlane_resources/
data.rs

1use std::collections::{HashMap, HashSet};
2use std::convert::{TryFrom, TryInto};
3use std::ops::Deref;
4use std::ops::DerefMut;
5use std::sync::Arc;
6
7use bincode::deserialize;
8use serde::{Deserialize, Serialize};
9
10use crate::{Path, ResourcePathSegment};
11use crate::error::Error;
12use crate::http::HttpRequest;
13
14pub type Meta = MetaDeref<HashMap<String, String>>;
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct MetaDeref<T> {
18    map: T,
19}
20
21impl<T> Deref for MetaDeref<T> {
22    type Target = T;
23
24    fn deref(&self) -> &Self::Target {
25        &self.map
26    }
27}
28
29impl<T> DerefMut for MetaDeref<T> {
30    fn deref_mut(&mut self) -> &mut Self::Target {
31        &mut self.map
32    }
33}
34
35impl Meta {
36    pub fn new() -> Self {
37        Self {
38            map: HashMap::new(),
39        }
40    }
41
42    pub fn single(key: &str, value: &str) -> Self {
43        let mut meta = Self::new();
44        meta.insert(key.to_string(), value.to_string());
45        meta
46    }
47
48    pub fn bin(&self) -> Result<Vec<u8>, Error> {
49        Ok(bincode::serialize(self)?)
50    }
51
52    pub fn from_bin<'a>(data: &'a [u8]) -> Result<Self, Error> {
53        Ok(bincode::deserialize::<Self>(data)?)
54    }
55}
56
57impl TryInto<Vec<u8>> for Meta {
58    type Error = Error;
59
60    fn try_into(self) -> Result<Vec<u8>, Self::Error> {
61        Ok(self.bin()?)
62    }
63}
64
65pub type Binary = Arc<Vec<u8>>;
66pub type DataSet<B> = HashMap<String, B>;
67
68
69#[derive(Debug, Clone, Serialize, Deserialize,strum_macros::Display)]
70pub enum BinSrc {
71    Memory(Binary),
72}
73
74impl BinSrc {
75    pub fn new(bin: Binary) -> Self {
76        Self::Memory(bin)
77    }
78}
79
80pub trait BinContext: Sync + Send {
81
82
83}
84
85
86impl BinSrc {
87
88    pub fn to_bin(&self, ctx: Arc<dyn BinContext>) -> Result<Binary, Error> {
89        match self {
90            BinSrc::Memory(bin) => Ok(bin.clone()),
91        }
92    }
93}
94
95impl TryFrom<Meta> for BinSrc {
96    type Error = Error;
97
98    fn try_from(meta: Meta) -> Result<Self, Self::Error> {
99        Ok(BinSrc::Memory(Arc::new(bincode::serialize(&meta)?)))
100    }
101}
102
103#[derive(Debug,Clone,Serialize,Deserialize,Eq,PartialEq)]
104pub enum DataKind {
105    Meta,
106    HttpRequest
107}
108
109#[derive(Debug,Clone,Serialize,Deserialize)]
110pub enum Data {
111    Meta(Meta),
112    HttpRequest(HttpRequest)
113}
114
115
116
117