cmake_parser/doc/command/project/
source_group.rs1use cmake_parser_derive::CMake;
2
3use crate::{
4 doc::command_scope::{CommandScope, ToCommandScope},
5 Token,
6};
7
8#[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}