camel_case_token_with_comment/
parse_token_file.rs1crate::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 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}