Skip to content

Commit

Permalink
Merge pull request #126 from adnanademovic/codegen-improvements
Browse files Browse the repository at this point in the history
Traverse subfolders when looking for dependencies
  • Loading branch information
adnanademovic authored Nov 25, 2019
2 parents 43a9567 + 477d516 commit df855c1
Showing 1 changed file with 50 additions and 1 deletion.
51 changes: 50 additions & 1 deletion rosrust_codegen/src/rosmsg_include.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ use crate::genmsg;
use proc_macro::TokenStream;
use quote::quote;
use std::env;
use std::ffi::OsStr;
use std::fs::read_dir;
use std::path::Path;

pub fn depend_on_messages(messages: &[&str], internal: bool) -> TokenStream {
Expand All @@ -20,10 +22,14 @@ pub fn depend_on_messages(messages: &[&str], internal: bool) -> TokenStream {
.split(':')
.map(String::from)
.collect::<Vec<String>>();
let paths = cmake_paths
let paths_owned = cmake_paths
.iter()
.chain(cmake_alt_paths.iter())
.chain(extra_paths.iter())
.flat_map(|v| find_all_package_groups(&Path::new(v)))
.collect::<Vec<String>>();
let paths = paths_owned
.iter()
.map(String::as_str)
.collect::<Vec<&str>>();
let output = genmsg::depend_on_messages(paths.as_slice(), messages)
Expand All @@ -36,6 +42,49 @@ pub fn depend_on_messages(messages: &[&str], internal: bool) -> TokenStream {
(quote! {#output}).into()
}

fn find_all_package_groups(root: &Path) -> Vec<String> {
categorize_tree_folders(root)
.into_iter()
.filter(|v| v.has_msg_or_srv_grandchild)
.map(|v| v.name)
.collect()
}

fn categorize_tree_folders(root: &Path) -> Vec<FolderInfo> {
if !root.is_dir() {
return vec![];
}
let mut folders = vec![];
let is_msg_or_srv =
root.file_name() == Some(OsStr::new("msg")) || root.file_name() == Some(OsStr::new("srv"));
let mut has_msg_or_srv_child = false;
let mut has_msg_or_srv_grandchild = false;
if let Ok(children) = read_dir(root) {
for child in children.filter_map(Result::ok) {
for folder in categorize_tree_folders(&child.path()) {
has_msg_or_srv_child = has_msg_or_srv_child || folder.is_msg_or_srv;
has_msg_or_srv_grandchild =
has_msg_or_srv_grandchild || folder.has_msg_or_srv_child;
folders.push(folder);
}
}
}
folders.push(FolderInfo {
name: root.to_str().unwrap_or("").into(),
is_msg_or_srv,
has_msg_or_srv_child,
has_msg_or_srv_grandchild,
});
folders
}

struct FolderInfo {
name: String,
is_msg_or_srv: bool,
has_msg_or_srv_child: bool,
has_msg_or_srv_grandchild: bool,
}

fn append_share_folder(path: &str) -> Option<String> {
Path::new(path).join("share").to_str().map(String::from)
}
Expand Down

0 comments on commit df855c1

Please sign in to comment.