1use std::{ffi::OsStr, path::Path};
4use tmc_langs_framework::{StudentFilePolicy, TmcProjectYml};
5
6pub struct MakeStudentFilePolicy {
7 project_config: TmcProjectYml,
8}
9
10impl StudentFilePolicy for MakeStudentFilePolicy {
11 fn new_with_project_config(project_config: TmcProjectYml) -> Self
12 where
13 Self: Sized,
14 {
15 Self { project_config }
16 }
17
18 fn get_project_config(&self) -> &TmcProjectYml {
19 &self.project_config
20 }
21
22 fn is_non_extra_student_file(&self, path: &Path) -> bool {
23 let ext = path.extension();
24 path.starts_with("src") && (ext == Some(OsStr::new("c")) || ext == Some(OsStr::new("h")))
25 }
26}
27
28#[cfg(test)]
29mod test {
30 use super::*;
31
32 #[test]
33 fn is_student_file() {
34 let policy = MakeStudentFilePolicy::new(Path::new(".")).unwrap();
35 assert!(policy.is_student_file(Path::new("src/file.c")));
36 assert!(policy.is_student_file(Path::new("src/file.h")));
37 assert!(policy.is_student_file(Path::new("src/dir/file.c")));
38 assert!(policy.is_student_file(Path::new("src/dir/file.h")));
39 }
40
41 #[test]
42 fn is_not_student_source_file() {
43 let policy = MakeStudentFilePolicy::new(Path::new(".")).unwrap();
44 assert!(!policy.is_student_file(Path::new("a.c")));
45 assert!(!policy.is_student_file(Path::new("a.h")));
46 assert!(!policy.is_student_file(Path::new("srcc")));
47 assert!(!policy.is_student_file(Path::new("dir/src/file")));
48 }
49}