serde2file 0.1.0

serialize some data to a file or deserialize a data from a file,support encrypt/decrypt file;将struct序列化化存储为文件,或者从文件反序列化为struct,文件存储时支持加密存储.
Documentation

serde2file

serialize some data to a file or deserialize a data from a file support encrypt/decrypt file

将struct序列化化存储为文件,或者从文件反序列化为struct 文件存储时支持加密存储

示例 / Example

use serde::{Deserialize, Serialize};
use aes_gcm::aead::{Aead, NewAead};
use aes_gcm::{Aes256Gcm, Key, Nonce};

use serde2file::prelude::*;

#[derive(Debug, Serialize, Deserialize, Default, PartialEq, Eq, FileSerializeAndDeserialize)]
#[file_encrypt(encrypt=TestEncryptTool::encrypt,decrypt=TestEncryptTool::decrypt)]
struct TestData {
    id: String,
    name: String,
}
/// a encryption and decryption tools
///
/// 加密和解密工具
#[allow(dead_code)]
struct TestEncryptTool;

/// some 
impl TestEncryptTool {
    pub fn get_aes_key_nonce() -> (String, String) {
        (
            "*)_#@140600!$=_^20220208)leb*$xz".into(),
            "abc$hy%95599".into(),
        )
    }
    pub fn encrypt(data: &str) -> DumpResult<Vec<u8>> {
        let (key_str, nonce_str) = Self::get_aes_key_nonce();
        let key = Key::from_slice(key_str.as_bytes());
        let cipher = Aes256Gcm::new(key);
        let nonce = Nonce::from_slice(nonce_str.as_bytes());
        let cipher_data = cipher.encrypt(nonce, data.as_bytes().as_ref()).unwrap();
        Ok(cipher_data)
    }
    pub fn decrypt(data: Vec<u8>) -> DumpResult<Vec<u8>> {
        let (key_str, nonce_str) = Self::get_aes_key_nonce();
        let key = Key::from_slice(key_str.as_bytes());
        let cipher = Aes256Gcm::new(key);
        let nonce = Nonce::from_slice(nonce_str.as_bytes());
        let plain_data = cipher.decrypt(nonce, data.as_ref()).unwrap();
        Ok(plain_data)
    }
}

#cfg(test)
mod test {
    use super::*;
    
    #[test]
    fn test_serialize_file() {
        let data = TestData {
            id: "01".into(),
            name: "hy".into(),
        };
        data.dump_to_file("/tmp").unwrap();
    }

    #[test]
    fn test_deserialize_file() {
        let data = TestData {
            id: "01".into(),
            name: "hy".into(),
        };
        println!("{}", std::any::type_name::<TestData>());
        let s_data = TestData::load_from_file("/tmp").unwrap();
        assert_eq!(data, s_data)
    }
}