fermah-common 0.1.2

Fermah common utilities and types.
Documentation
use std::borrow::Cow;

use serde::{Deserialize, Serialize};

use super::gpu::GPUModel;
use crate::hash::Hashable;

#[derive(Debug, Serialize, Deserialize, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Default)]
#[serde(rename_all = "camelCase")]
pub struct ResourceRequirement {
    pub min_vram: Option<u64>,
    pub min_ram: Option<u64>,
    pub min_ssd: Option<u64>,
    pub min_gpu: Vec<GPUModel>,
    pub min_cpu_cores: Option<u64>,
}

impl Hashable for ResourceRequirement {
    fn collect(&self) -> Cow<[u8]> {
        serde_json::to_vec(self).unwrap().into()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_serialization() {
        let rrs = vec![
            ResourceRequirement {
                min_vram: Some(12 * 1024 * 1024 * 1024),
                min_ram: Some(16 * 1024 * 1024 * 1024),
                min_ssd: Some(16 * 1024 * 1024 * 1024),
                min_gpu: vec![GPUModel::GeForceRtx3060_12GB],
                min_cpu_cores: Some(16),
            },
            ResourceRequirement {
                min_vram: Some(4 * 1024 * 1024 * 1024),
                min_ram: Some(200 * 1024 * 1024 * 1024),
                min_ssd: Some(16 * 1024 * 1024 * 1024),
                min_gpu: vec![GPUModel::GeForceRtx3060_12GB],
                min_cpu_cores: Some(96),
            },
            ResourceRequirement {
                min_vram: None,
                min_ram: Some(200 * 1024 * 1024 * 1024),
                min_ssd: Some(16 * 1024 * 1024 * 1024),
                min_gpu: vec![GPUModel::GeForceRtx3060_12GB],
                min_cpu_cores: None,
            },
        ];

        let s = serde_json::to_string_pretty(&rrs).unwrap();

        println!("{}", s);

        let rs: Vec<ResourceRequirement> = serde_json::from_str(&s).unwrap();
        assert_eq!(rrs, rs);
        println!("{:?}", rs);
    }
}