rosrust_codegen/
rosmsg_include.rs
1use crate::genmsg;
2use proc_macro::TokenStream;
3use quote::quote;
4use std::env;
5use std::path::Path;
6
7pub fn depend_on_messages(
8 messages: &[&str],
9 internal: bool,
10 ignore_bad_messages: bool,
11) -> TokenStream {
12 let cmake_paths = env::var("CMAKE_PREFIX_PATH")
13 .unwrap_or_default()
14 .split(':')
15 .filter_map(append_share_folder)
16 .collect::<Vec<String>>();
17 let cmake_alt_paths = env::var("CMAKE_PREFIX_PATH")
18 .unwrap_or_default()
19 .split(':')
20 .filter_map(append_src_folder)
21 .collect::<Vec<String>>();
22 let extra_paths = env::var("ROSRUST_MSG_PATH")
23 .unwrap_or_default()
24 .split(':')
25 .map(String::from)
26 .collect::<Vec<String>>();
27 let paths = cmake_paths
28 .iter()
29 .chain(cmake_alt_paths.iter())
30 .chain(extra_paths.iter())
31 .map(String::as_str)
32 .collect::<Vec<&str>>();
33 let output = genmsg::depend_on_messages(ignore_bad_messages, paths.as_slice(), messages)
34 .unwrap_or_else(|r| panic!("{}", r))
35 .token_stream(&if internal {
36 quote! { crate:: }
37 } else {
38 quote! { rosrust:: }
39 });
40 (quote! {#output}).into()
41}
42
43fn append_share_folder(path: &str) -> Option<String> {
44 Path::new(path).join("share").to_str().map(String::from)
45}
46
47fn append_src_folder(path: &str) -> Option<String> {
48 Path::new(path)
49 .join("..")
50 .join("src")
51 .to_str()
52 .map(String::from)
53}