changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > demo / annotate obj/src/lib.rs

changeset 3: 8f59e2f1b8c4
parent: e4f8df713d55
child: 315fedf35bc7
author: ellis <ellis@rwest.io>
date: Fri, 05 May 2023 22:41:30 -0400
permissions: -rw-r--r--
description: stuff
1
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
1
 //! obj/src/lib.rs --- Objective type library
3
ellis <ellis@rwest.io>
parents: 1
diff changeset
2
 #![feature(associated_type_bounds)]
1
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
3
 mod err;
3
ellis <ellis@rwest.io>
parents: 1
diff changeset
4
 pub use err::{Error, Result};
ellis <ellis@rwest.io>
parents: 1
diff changeset
5
 mod types;
ellis <ellis@rwest.io>
parents: 1
diff changeset
6
 pub use types::*;
1
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
7
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
8
 pub use ron;
3
ellis <ellis@rwest.io>
parents: 1
diff changeset
9
 pub use bincode;
ellis <ellis@rwest.io>
parents: 1
diff changeset
10
 pub use serde_json;
1
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
11
 use ron::extensions::Extensions;
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
12
 use serde::{de::DeserializeOwned, Deserialize, Serialize};
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
13
 use std::io;
3
ellis <ellis@rwest.io>
parents: 1
diff changeset
14
 use std::collections::{HashMap, BTreeMap};
1
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
15
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
16
 /// common trait for all config modules. This trait provides functions
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
17
 /// for de/serializing to/from RON, updating fields, and formatting.
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
18
 pub trait Configure: Objective {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
19
   fn update(&self) -> Result<()> {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
20
     Ok(())
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
21
   }
0
ellis <ellis@rwest.io>
parents:
diff changeset
22
 }
ellis <ellis@rwest.io>
parents:
diff changeset
23
 
1
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
24
 /// Objective trait
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
25
 /// Define Object behaviors, implemented by Objects
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
26
 pub trait Objective {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
27
   fn encode(&self) -> Result<Vec<u8>>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
28
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
29
     Self: Serialize,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
30
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
31
     Ok(bincode::serialize(self)?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
32
   }
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
33
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
34
   fn encode_into<W>(&self, writer: W) -> Result<()>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
35
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
36
     W: io::Write,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
37
     Self: Serialize,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
38
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
39
     Ok(bincode::serialize_into(writer, self)?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
40
   }
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
41
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
42
   fn decode<'a>(&self, bytes: &'a [u8]) -> Result<Self>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
43
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
44
     Self: Deserialize<'a>,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
45
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
46
     Ok(bincode::deserialize(bytes)?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
47
   }
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
48
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
49
   fn decode_from<R>(&self, rdr: R) -> Result<Self>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
50
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
51
     R: io::Read,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
52
     Self: DeserializeOwned,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
53
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
54
     Ok(bincode::deserialize_from(rdr)?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
55
   }
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
56
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
57
   fn to_ron_writer<W>(&self, writer: W) -> Result<()>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
58
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
59
     W: io::Write,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
60
     Self: Serialize,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
61
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
62
     Ok(ron::ser::to_writer_pretty(
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
63
       writer,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
64
       &self,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
65
       ron::ser::PrettyConfig::new()
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
66
         .indentor("  ".to_owned())
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
67
         .extensions(Extensions::all()),
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
68
     )?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
69
   }
0
ellis <ellis@rwest.io>
parents:
diff changeset
70
 
1
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
71
   fn to_ron_string(&self) -> Result<String>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
72
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
73
     Self: Serialize,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
74
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
75
     Ok(ron::ser::to_string_pretty(
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
76
       &self,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
77
       ron::ser::PrettyConfig::new().indentor("  ".to_owned()),
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
78
     )?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
79
   }
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
80
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
81
   fn from_ron_reader<R>(&self, mut rdr: R) -> Result<Self>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
82
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
83
     R: io::Read,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
84
     Self: DeserializeOwned,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
85
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
86
     let mut bytes = Vec::new();
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
87
     rdr.read_to_end(&mut bytes)?;
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
88
     Ok(ron::de::from_bytes(&bytes)?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
89
   }
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
90
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
91
   fn from_ron_str<'a>(s: &'a str) -> Result<Self>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
92
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
93
     Self: Deserialize<'a>,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
94
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
95
     Ok(ron::de::from_bytes(s.as_bytes())?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
96
   }
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
97
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
98
   fn to_json_writer<W>(&self, writer: W) -> Result<()>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
99
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
100
     W: io::Write,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
101
     Self: Serialize,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
102
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
103
     //    let formatter = serde_json::ser::PrettyFormatter::with_indent(b"  ");
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
104
     Ok(serde_json::ser::to_writer_pretty(writer, &self)?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
105
   }
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
106
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
107
   fn to_json_string(&self) -> Result<String>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
108
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
109
     Self: Serialize,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
110
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
111
     Ok(serde_json::ser::to_string_pretty(&self)?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
112
   }
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
113
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
114
   fn from_json_reader<R>(&self, mut rdr: R) -> Result<Self>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
115
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
116
     R: io::Read,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
117
     Self: DeserializeOwned,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
118
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
119
     let mut bytes = Vec::new();
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
120
     rdr.read_to_end(&mut bytes)?;
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
121
     Ok(serde_json::de::from_slice(&bytes)?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
122
   }
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
123
 
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
124
   fn from_json_str<'a>(s: &'a str) -> Result<Self>
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
125
   where
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
126
     Self: Deserialize<'a>,
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
127
   {
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
128
     Ok(serde_json::de::from_slice(s.as_bytes())?)
e4f8df713d55 scaffolding from lives past
ellis <ellis@rwest.io>
parents: 0
diff changeset
129
   }
0
ellis <ellis@rwest.io>
parents:
diff changeset
130
 }
3
ellis <ellis@rwest.io>
parents: 1
diff changeset
131
 
ellis <ellis@rwest.io>
parents: 1
diff changeset
132
 impl<T> Objective for Vec<T> {}
ellis <ellis@rwest.io>
parents: 1
diff changeset
133
 impl<K,V> Objective for HashMap<K,V> {}
ellis <ellis@rwest.io>
parents: 1
diff changeset
134
 impl<K,V> Objective for BTreeMap<K,V> {}