ixc_schema/state_object/
key.rs1use crate::buffer::{Reader, ReverseSliceWriter, Writer, WriterFactory};
2use crate::decoder::DecodeError;
3use crate::encoder::EncodeError;
4use crate::mem::MemoryManager;
5use crate::state_object::value::ObjectValue;
6use crate::state_object::KeyFieldValue;
7
8pub fn encode_object_key<'a, 'b, K: ObjectKey>(prefix: &[u8], key: &K::In<'a>, writer_factory: &'b dyn WriterFactory) -> Result<&'b [u8], EncodeError> {
10 let out_size = <K as ObjectKey>::out_size(key) + prefix.len();
11 let mut writer = writer_factory.new_reverse(out_size)?;
12 <K as ObjectKey>::encode(key, &mut writer)?;
13 writer.write(prefix)?;
15 Ok(writer.finish())
16}
17
18pub fn decode_object_key<'a, K: ObjectKey>(input: &'a [u8], memory_manager: &'a MemoryManager) -> Result<K::Out<'a>, DecodeError> {
20 <K as ObjectKey>::decode(input, memory_manager)
21}
22
23pub trait ObjectKey: ObjectValue {
25 fn encode<'a>(key: &Self::In<'a>, writer: &mut ReverseSliceWriter) -> Result<(), EncodeError>;
27
28 fn decode<'a>(input: &'a [u8], memory_manager: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError>;
30
31 fn out_size<'a>(key: &Self::In<'a>) -> usize;
33}
34
35impl ObjectKey for () {
36 fn encode<'a>(key: &Self::In<'a>, writer: &mut ReverseSliceWriter) -> Result<(), EncodeError> {
37 Ok(())
38 }
39
40 fn decode<'a>(input: &'a [u8], memory_manager: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
41 Ok(())
42 }
43
44 fn out_size<'a>(key: &Self::In<'a>) -> usize { 0 }
45}
46
47impl<A: KeyFieldValue> ObjectKey for A {
48 fn encode<'a>(key: &Self::In<'a>, writer: &mut ReverseSliceWriter) -> Result<(), EncodeError> {
49 A::encode_terminal(key, writer)
50 }
51
52 fn decode<'a>(input: &'a [u8], memory_manager: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
53 let mut reader = input;
54 let a = A::decode_terminal(&mut reader, memory_manager)?;
55 reader.is_done()?;
56 Ok(a)
57 }
58
59 fn out_size<'a>(key: &Self::In<'a>) -> usize {
60 A::out_size_terminal(key)
61 }
62}
63
64impl<A: KeyFieldValue> ObjectKey for (A,) {
65 fn encode<'a>(key: &Self::In<'a>, writer: &mut ReverseSliceWriter) -> Result<(), EncodeError> {
66 A::encode(&key.0, writer)
67 }
68
69 fn decode<'a>(input: &'a [u8], memory_manager: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
70 let mut reader = input;
71 let a = A::decode(&mut reader, memory_manager)?;
72 reader.is_done()?;
73 Ok((a,))
74 }
75
76 fn out_size<'a>(key: &Self::In<'a>) -> usize {
77 A::out_size_terminal(&key.0)
78 }
79}
80
81impl<A: KeyFieldValue, B: KeyFieldValue> ObjectKey for (A, B) {
82 fn encode<'a>(key: &Self::In<'a>, writer: &mut ReverseSliceWriter) -> Result<(), EncodeError> {
83 B::encode_terminal(&key.1, writer)?;
84 A::encode(&key.0, writer)
85 }
86
87 fn decode<'a>(input: &'a [u8], memory_manager: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
88 let mut reader = input;
89 let a = A::decode(&mut reader, memory_manager)?;
90 let b = B::decode_terminal(&mut reader, memory_manager)?;
91 reader.is_done()?;
92 Ok((a, b))
93 }
94
95 fn out_size<'a>(key: &Self::In<'a>) -> usize {
96 A::out_size(&key.0) + B::out_size_terminal(&key.1)
97 }
98}
99
100impl<A: KeyFieldValue, B: KeyFieldValue, C: KeyFieldValue> ObjectKey for (A, B, C) {
101 fn encode<'a>(key: &Self::In<'a>, writer: &mut ReverseSliceWriter) -> Result<(), EncodeError> {
102 C::encode_terminal(&key.2, writer)?;
103 B::encode(&key.1, writer)?;
104 A::encode(&key.0, writer)
105 }
106
107 fn decode<'a>(input: &'a [u8], memory_manager: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
108 let mut reader = input;
109 let a = A::decode(&mut reader, memory_manager)?;
110 let b = B::decode(&mut reader, memory_manager)?;
111 let c = C::decode_terminal(&mut reader, memory_manager)?;
112 reader.is_done()?;
113 Ok((a, b, c))
114 }
115
116 fn out_size<'a>(key: &Self::In<'a>) -> usize {
117 A::out_size(&key.0) + B::out_size(&key.1) + C::out_size_terminal(&key.2)
118 }
119}
120
121impl<A: KeyFieldValue, B: KeyFieldValue, C: KeyFieldValue, D: KeyFieldValue> ObjectKey for (A, B, C, D) {
122 fn encode<'a>(key: &Self::In<'a>, writer: &mut ReverseSliceWriter) -> Result<(), EncodeError> {
123 D::encode_terminal(&key.3, writer)?;
124 C::encode(&key.2, writer)?;
125 B::encode(&key.1, writer)?;
126 A::encode(&key.0, writer)
127 }
128
129 fn decode<'a>(input: &'a [u8], memory_manager: &'a MemoryManager) -> Result<Self::Out<'a>, DecodeError> {
130 let mut reader = input;
131 let a = A::decode(&mut reader, memory_manager)?;
132 let b = B::decode(&mut reader, memory_manager)?;
133 let c = C::decode(&mut reader, memory_manager)?;
134 let d = D::decode_terminal(&mut reader, memory_manager)?;
135 reader.is_done()?;
136 Ok((a, b, c, d))
137 }
138
139 fn out_size<'a>(key: &Self::In<'a>) -> usize {
140 A::out_size(&key.0) + B::out_size(&key.1) + C::out_size(&key.2) + D::out_size_terminal(&key.3)
141 }
142}
143