rust_multicodec/codec_prefix.rs
1use std::io::{Write, Error};
2use integer_encoding::VarInt;
3use codec::CodecType;
4
5/// Returns the data prefixed with the codec's code in a u8 buffer.
6///
7/// # Arguments
8///
9/// * `codec_code` - The codec type, eg. CodecType::JSON
10/// * `data` - the data to be prefixed
11///
12/// # Example
13///
14/// ```
15/// extern crate rust_multicodec;
16/// extern crate hex_slice;
17///
18/// use rust_multicodec::codec_prefix;
19/// use rust_multicodec::codec::CodecType;
20/// use hex_slice::AsHex;
21/// use std::process;
22///
23/// fn main(){
24/// let data="Live long and prosper";
25///
26/// println!("{:X}",codec_prefix::add(CodecType::JSON,data.as_bytes()).unwrap().as_hex());
27/// // it will print [1 4C 69 76 65 20 6C 6F 6E 67 20 61 6E 64 20 70 72 6F 73 70 65 72]
28/// }
29/// ```
30///
31pub fn add(codec: CodecType, data: &[u8]) -> Result<Vec<u8>, Error> {
32 // encoding codec's (as decimal) into a varint
33 let mut target: Vec<u8> = codec.hex().encode_var_vec();
34 target.write(data)?;
35 Ok(target)
36}
37
38/// Returns the codec's code the data was prefixed with.
39///
40/// # Arguments
41///
42/// * `data` - the data with prefix
43///
44/// # Example
45///
46/// ```
47/// extern crate rust_multicodec;
48/// extern crate hex_slice;
49///
50/// use rust_multicodec::codec_prefix;
51/// use rust_multicodec::codec::CodecType;
52/// use hex_slice::AsHex;
53/// use std::process;
54///
55/// fn main(){
56/// let data="Live long and prosper";
57///
58/// let prefixed=codec_prefix::add(CodecType::JSON,data.as_bytes()).unwrap();
59/// println!("{:?}",codec_prefix::get(prefixed.as_slice()).unwrap());
60/// // it will print "JSON"
61/// }
62/// ```
63///
64pub fn get(data: &[u8]) -> Option<CodecType>{
65 let decoded:(u64,usize)=u64::decode_var_vec(&Vec::from(data));
66 CodecType::by_hex(decoded.0)
67}
68
69/// Removes the codec prefix and returns the raw data.
70///
71/// # Arguments
72///
73/// * `data` - the data with prefix
74///
75/// # Example
76///
77/// ```
78/// extern crate rust_multicodec;
79/// extern crate hex_slice;
80///
81/// use rust_multicodec::codec_prefix;
82/// use rust_multicodec::codec::CodecType;
83/// use hex_slice::AsHex;
84/// use std::process;
85///
86/// fn main(){
87/// let data="Live long and prosper";
88///
89/// let prefixed=codec_prefix::add(CodecType::JSON,data.as_bytes()).unwrap();
90/// let raw_data=codec_prefix::remove(prefixed.as_slice());
91/// println!("Original data was {:?}", String::from_utf8(raw_data.to_vec()).unwrap())
92/// // it will print return "Original data was Live long and prosper"
93/// }
94/// ```
95///
96pub fn remove<'a>(data: &'a [u8]) -> &'a [u8] {
97 let decoded:(u64,usize)=u64::decode_var_vec(&Vec::from(data));
98 &data[decoded.1..]
99}
100
101#[cfg(test)]
102mod tests {
103 use super::*;
104
105 const DATA:&str="Live long and prosper";
106
107 #[test]
108 fn prefix_works(){
109 let result=add(CodecType::JSON,DATA.as_bytes());
110 assert_eq!(result.is_ok(),true);
111
112 let prefixed=result.unwrap();
113 assert_eq!(get(prefixed.as_slice()).unwrap(),CodecType::JSON);
114 assert_eq!(remove(prefixed.as_slice()), DATA.as_bytes());
115 }
116}