ros_cmake_parser/doc/
ros.rs1use std::borrow::Cow;
2
3use crate::Token;
4
5use super::RawCommand;
6
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub enum RosCommand<'t> {
9 AmentPackage,
10 CatkinPackage,
11 AmentTargetDependencies(AmentTargetDependencies<'t>),
12}
13
14#[derive(Debug, Clone, PartialEq, Eq)]
15pub struct AmentTargetDependencies<'t> {
16 pub target: Token<'t>,
17 pub dependencies: Vec<Token<'t>>,
18}
19
20impl<'t> RosCommand<'t> {
21 pub fn from_raw(raw: &RawCommand<'t>) -> Option<Self> {
22 match ascii_lowercase(raw.identifier.as_ref()).as_ref() {
23 b"ament_package" => Some(Self::AmentPackage),
24 b"catkin_package" => Some(Self::CatkinPackage),
25 b"ament_target_dependencies" => {
26 let (target, rest) = raw.tokens.split_first()?;
27 let dependencies = rest
28 .iter()
29 .filter(|token| !is_ament_keyword(token.as_ref()))
30 .cloned()
31 .collect();
32 Some(Self::AmentTargetDependencies(AmentTargetDependencies {
33 target: target.clone(),
34 dependencies,
35 }))
36 }
37 _ => None,
38 }
39 }
40}
41
42fn is_ament_keyword(token: &[u8]) -> bool {
43 matches!(token, b"SYSTEM" | b"PUBLIC" | b"INTERFACE")
44}
45
46fn ascii_lowercase(bytes: &[u8]) -> Cow<'_, [u8]> {
47 if bytes.iter().any(u8::is_ascii_uppercase) {
48 Cow::Owned(bytes.to_ascii_lowercase())
49 } else {
50 Cow::Borrowed(bytes)
51 }
52}