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}