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}