cmake_parser/doc/command/project/
source_group.rs

1use cmake_parser_derive::CMake;
2
3use crate::{
4    doc::command_scope::{CommandScope, ToCommandScope},
5    Token,
6};
7
8/// Define a grouping for source files in IDE project generation.
9///
10/// Reference: <https://cmake.org/cmake/help/v3.26/command/source_group.html>
11#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
12#[cmake(pkg = "crate", untagged)]
13pub enum SourceGroup<'t> {
14    #[cmake(transparent)]
15    Tree(TreeSourceGroup<'t>),
16    Folder(FolderSourceGroup<'t>),
17}
18
19impl<'t> ToCommandScope for SourceGroup<'t> {
20    fn to_command_scope(&self) -> CommandScope {
21        CommandScope::Project
22    }
23}
24
25#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
26#[cmake(pkg = "crate")]
27pub struct TreeSourceGroup<'t> {
28    #[cmake(positional)]
29    pub root: Token<'t>,
30    pub prefix: Option<Token<'t>>,
31    pub files: Option<Vec<Token<'t>>>,
32}
33
34#[derive(CMake, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
35#[cmake(pkg = "crate", default = "regular_expression")]
36pub struct FolderSourceGroup<'t> {
37    #[cmake(positional)]
38    pub group_name: Token<'t>,
39    pub files: Option<Vec<Token<'t>>>,
40    pub regular_expression: Option<Token<'t>>,
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46    use crate::doc::cmake_parse::tests::{token, tokens_vec};
47    use crate::*;
48    use pretty_assertions::assert_eq;
49
50    #[test]
51    fn source_group() {
52        let src = include_bytes!("../../../../../fixture/commands/project/source_group");
53        let cmakelists = parse_cmakelists(src).unwrap();
54        let doc = Doc::from(cmakelists);
55        assert_eq!(
56            doc.commands(),
57            Ok(vec![
58                Command::SourceGroup(Box::new(SourceGroup::Folder(FolderSourceGroup {
59                    group_name: token(b"grp1"),
60                    files: None,
61                    regular_expression: Some(token(b"regex1")),
62                }))),
63                Command::SourceGroup(Box::new(SourceGroup::Folder(FolderSourceGroup {
64                    group_name: token(b"grp2"),
65                    files: None,
66                    regular_expression: Some(token(b"regex2")),
67                }))),
68                Command::SourceGroup(Box::new(SourceGroup::Folder(FolderSourceGroup {
69                    group_name: token(b"grp3"),
70                    files: None,
71                    regular_expression: None,
72                }))),
73                Command::SourceGroup(Box::new(SourceGroup::Folder(FolderSourceGroup {
74                    group_name: token(b"grp4"),
75                    files: Some(tokens_vec([b"file1", b"file2"])),
76                    regular_expression: None,
77                }))),
78                Command::SourceGroup(Box::new(SourceGroup::Folder(FolderSourceGroup {
79                    group_name: token(b"grp5"),
80                    files: Some(tokens_vec([b"file3", b"file4"])),
81                    regular_expression: Some(token(b"regex3")),
82                }))),
83                Command::SourceGroup(Box::new(SourceGroup::Tree(TreeSourceGroup {
84                    root: token(b"grp6"),
85                    prefix: None,
86                    files: None,
87                }))),
88                Command::SourceGroup(Box::new(SourceGroup::Tree(TreeSourceGroup {
89                    root: token(b"grp7"),
90                    prefix: Some(token(b"prefix1")),
91                    files: None,
92                }))),
93                Command::SourceGroup(Box::new(SourceGroup::Tree(TreeSourceGroup {
94                    root: token(b"grp8"),
95                    prefix: None,
96                    files: Some(tokens_vec([b"file5", b"file6"])),
97                }))),
98                Command::SourceGroup(Box::new(SourceGroup::Tree(TreeSourceGroup {
99                    root: token(b"grp9"),
100                    prefix: Some(token(b"prefix2")),
101                    files: Some(tokens_vec([b"file7", b"file8"])),
102                }))),
103            ])
104        )
105    }
106}