starlane_resources/
data.rs1use 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