summaryrefslogtreecommitdiff
path: root/systems/_asset/test/src/lib.rs
blob: 4b62028ce3b17a9b9958f72a2935e85bf0b60b2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use std::path::PathBuf;

use asset_system::{
    RWDataTest, ensure_eq,
    error::{DataReadError, DataWriteError},
    rw::RWData,
};

#[derive(RWDataTest)]
pub struct FooData {
    pub age: i32,
    pub name: String,
}

impl RWData<FooData> for FooData {
    async fn read(path: &PathBuf) -> Result<FooData, DataReadError> {
        let content = tokio::fs::read_to_string(path)
            .await
            .map_err(|e| DataReadError::IoError(e))?;
        let parts: Vec<&str> = content.split('=').collect();
        if parts.len() != 2 {
            return Err(DataReadError::ParseError("Invalid format".to_string()));
        }
        let name = parts[0].to_string();
        let age: i32 = parts[1]
            .parse()
            .map_err(|_| DataReadError::ParseError("Invalid age".to_string()))?;
        Ok(FooData { age, name })
    }

    async fn write(data: FooData, path: &PathBuf) -> Result<(), DataWriteError> {
        let content = format!("{}={}", data.name, data.age);
        tokio::fs::write(path, content)
            .await
            .map_err(|e| DataWriteError::IoError(e))?;
        Ok(())
    }

    fn test_data() -> FooData {
        FooData {
            age: 24,
            name: "OneOneFourFiveOneFour".to_string(),
        }
    }

    fn verify_data(data_a: FooData, data_b: FooData) -> bool {
        ensure_eq!(data_a.age, data_b.age);
        ensure_eq!(data_a.name, data_b.name);
        return true;
    }
}