Skip to main content

ros_cmake_parser/doc/
ros.rs

1use 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}