rrdcached_client/
sanitisation.rs

1use crate::errors::RRDCachedClientError;
2
3pub fn check_data_source_name(name: &str) -> Result<(), RRDCachedClientError> {
4    if name.is_empty() || name.len() > 64 {
5        return Err(RRDCachedClientError::InvalidDataSourceName(
6            "name must be between 1 and 64 characters".to_string(),
7        ));
8    }
9    if !name
10        .chars()
11        .all(|c| c.is_alphanumeric() || c == '_' || c == '-')
12    {
13        return Err(RRDCachedClientError::InvalidDataSourceName(
14            "name must only contain alphanumeric characters and underscores".to_string(),
15        ));
16    }
17    Ok(())
18}
19
20pub fn check_rrd_path(name: &str) -> Result<(), RRDCachedClientError> {
21    if name.is_empty() || name.len() > 64 {
22        return Err(RRDCachedClientError::InvalidCreateDataSerie(
23            "name must be between 1 and 64 characters".to_string(),
24        ));
25    }
26    if !name
27        .chars()
28        .all(|c| c.is_alphanumeric() || c == '_' || c == '-')
29    {
30        return Err(RRDCachedClientError::InvalidCreateDataSerie(
31            "name must only contain alphanumeric characters and underscores".to_string(),
32        ));
33    }
34    Ok(())
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn test_check_data_source_name() {
43        let result = check_data_source_name("test");
44        assert!(result.is_ok());
45
46        let result = check_data_source_name("test_");
47        assert!(result.is_ok());
48
49        let result = check_data_source_name("test-");
50        assert!(result.is_ok());
51
52        let result = check_data_source_name("test_1_a");
53        assert!(result.is_ok());
54
55        let result = check_data_source_name("");
56        assert!(result.is_err());
57
58        let result = check_data_source_name("a".repeat(65).as_str());
59        assert!(result.is_err());
60
61        let result = check_data_source_name("test!");
62        assert!(result.is_err());
63
64        let result = check_data_source_name("test\n");
65        assert!(result.is_err());
66
67        let result = check_data_source_name("test:GAUGE");
68        assert!(result.is_err());
69    }
70
71    #[test]
72    fn test_check_rrd_path() {
73        let result = check_rrd_path("test");
74        assert!(result.is_ok());
75
76        let result = check_rrd_path("test_");
77        assert!(result.is_ok());
78
79        let result = check_rrd_path("test-");
80        assert!(result.is_ok());
81
82        let result = check_rrd_path("test_1_a");
83        assert!(result.is_ok());
84
85        let result = check_rrd_path("");
86        assert!(result.is_err());
87
88        let result = check_rrd_path("a".repeat(65).as_str());
89        assert!(result.is_err());
90
91        let result = check_rrd_path("test!");
92        assert!(result.is_err());
93
94        let result = check_rrd_path("test\n");
95        assert!(result.is_err());
96
97        let result = check_rrd_path("test.rrd");
98        assert!(result.is_err());
99    }
100}