camel_case_token_with_comment/
parse_token_file.rs

1// ---------------- [ File: camel-case-token-with-comment/src/parse_token_file.rs ]
2crate::ix!();
3
4pub async fn parse_token_file(
5    filename: &str
6) -> Result<Vec<CamelCaseTokenWithComment>, TokenParseError>
7{
8    info!("Parsing token file: {}", filename);
9
10    let file = tokio::fs::File::open(filename).await.map_err(|e| {
11        error!("Failed to open file: {}. Error: {:?}", filename, e);
12        TokenParseError::IoError(e)
13    })?;
14
15    let reader = tokio::io::BufReader::new(file);
16    let mut lines = reader.lines();
17
18    let mut tokens = Vec::new();
19
20    while let Some(line) = lines.next_line().await.map_err(|e| {
21        error!("Failed to read line from file: {}. Error: {:?}", filename, e);
22        TokenParseError::IoError(e)
23    })? {
24        let trimmed = line.trim().to_string();
25        if trimmed.is_empty() {
26            debug!("Skipping empty line in file: {}", filename);
27            continue;
28        }
29
30        match trimmed.parse::<CamelCaseTokenWithComment>() {
31            Ok(token) => {
32                trace!("Successfully parsed token: {}", token);
33                tokens.push(token);
34            }
35            Err(e) => {
36                warn!("Token parse error: {:?} in file: {}", e, filename);
37            }
38        }
39    }
40
41    info!(
42        "Successfully parsed {} tokens from file: {}",
43        tokens.len(),
44        filename
45    );
46    Ok(tokens)
47}
48
49#[cfg(test)]
50mod test_parse_token_file {
51    use super::*;
52
53    #[traced_test]
54    async fn test_parse_token_file_valid() {
55        tracing::info!("Testing parse_token_file with valid content");
56        let mut tmpfile = NamedTempFile::new().unwrap();
57        writeln!(tmpfile, "Token1 -- Comment1").unwrap();
58        writeln!(tmpfile, "Token2").unwrap();
59
60        let path = tmpfile.into_temp_path();
61        let filename = path.to_str().unwrap();
62        let tokens = parse_token_file(filename).await.unwrap();
63
64        pretty_assert_eq!(tokens.len(), 2);
65        pretty_assert_eq!(tokens[0].data(), "Token1");
66        pretty_assert_eq!(*tokens[0].comment(), Some("Comment1".to_string()));
67
68        pretty_assert_eq!(tokens[1].data(), "Token2");
69        pretty_assert_eq!(*tokens[1].comment(), None);
70    }
71
72    #[traced_test]
73    async fn test_parse_token_file_empty_lines() {
74        tracing::info!("Testing parse_token_file with empty lines");
75        let mut tmpfile = NamedTempFile::new().unwrap();
76        writeln!(tmpfile, "").unwrap();
77        writeln!(tmpfile, "   ").unwrap();
78        writeln!(tmpfile, "TokenWithData").unwrap();
79
80        let path = tmpfile.into_temp_path();
81        let filename = path.to_str().unwrap();
82        let tokens = parse_token_file(filename).await.unwrap();
83
84        pretty_assert_eq!(tokens.len(), 1);
85        pretty_assert_eq!(tokens[0].data(), "TokenWithData");
86        pretty_assert_eq!(*tokens[0].comment(), None);
87    }
88
89    #[traced_test]
90    async fn test_parse_token_file_io_error() {
91        tracing::info!("Testing parse_token_file with non-existent file");
92        let result = parse_token_file("non_existent_file.txt").await;
93        assert!(matches!(result, Err(TokenParseError::IoError(_))));
94    }
95
96    #[traced_test]
97    async fn test_parse_token_file_invalid_lines() {
98        tracing::info!("Testing parse_token_file with invalid lines");
99        let mut tmpfile = NamedTempFile::new().unwrap();
100        writeln!(tmpfile, "-- starts with comment").unwrap();
101        writeln!(tmpfile, " ").unwrap();
102        writeln!(tmpfile, "ValidToken -- ValidComment").unwrap();
103
104        let path = tmpfile.into_temp_path();
105        let filename = path.to_str().unwrap();
106        let tokens = parse_token_file(filename).await.unwrap();
107
108        // Invalid lines are ignored with warnings, only valid lines remain
109        pretty_assert_eq!(tokens.len(), 1);
110        pretty_assert_eq!(tokens[0].data(), "ValidToken");
111        pretty_assert_eq!(*tokens[0].comment(), Some("ValidComment".to_string()));
112    }
113}