#![allow(dead_code)]
use std::path::{Path, PathBuf};
pub const PROJECT_CONFIG: &str = "mecha10.json";
pub mod project {
pub const NODES_DIR: &str = "nodes";
pub const DRIVERS_DIR: &str = "drivers";
pub const TYPES_DIR: &str = "types";
pub const BEHAVIORS_DIR: &str = "behaviors";
pub const ASSETS_DIR: &str = "assets";
pub const ASSETS_IMAGES_DIR: &str = "assets/images";
pub const MODELS_DIR: &str = "models";
pub const LOGS_DIR: &str = "logs";
pub const SIMULATION_DIR: &str = "simulation";
pub const SIMULATION_MODELS_DIR: &str = "simulation/models";
pub const SIMULATION_ENVIRONMENTS_DIR: &str = "simulation/environments";
pub fn model_config(model_name: &str) -> String {
format!("simulation/models/{}/model.json", model_name)
}
pub fn environment_config(env_name: &str) -> String {
format!("simulation/environments/{}/environment.json", env_name)
}
pub const SIMULATION_GODOT_DIR: &str = "simulation/godot";
pub const TARGET_DIR: &str = "target";
pub const SRC_DIR: &str = "src";
}
pub mod config {
pub const DIR: &str = "configs";
pub const NODES_DIR: &str = "configs/nodes";
pub const NODES_MECHA10_DIR: &str = "configs/nodes/@mecha10";
pub const NODES_LOCAL_DIR: &str = "configs/nodes/@local";
pub const SIMULATION_DIR: &str = "configs/simulation";
pub const SIMULATION_CONFIG: &str = "configs/simulation/config.json";
pub fn framework_node(node_name: &str) -> String {
format!("configs/nodes/@mecha10/{}/config.json", node_name)
}
pub fn local_node(node_name: &str) -> String {
format!("configs/nodes/@local/{}/config.json", node_name)
}
pub fn project_node(node_name: &str) -> String {
format!("configs/nodes/{}/config.json", node_name)
}
}
pub mod docker {
pub const DIR: &str = "docker";
pub const COMPOSE_FILE: &str = "docker/docker-compose.yml";
pub const COMPOSE_REMOTE_FILE: &str = "docker/docker-compose.remote.yml";
pub const DOCKERFILE_REMOTE: &str = "docker/Dockerfile.remote";
pub const DOCKERFILE_ROBOT_BUILDER: &str = "docker/robot-builder.Dockerfile";
}
pub mod env {
pub const EXAMPLE: &str = ".env.example";
pub const FILE: &str = ".env";
}
pub mod meta {
pub const README: &str = "README.md";
pub const GITIGNORE: &str = ".gitignore";
pub const PACKAGE_JSON: &str = "package.json";
pub const REQUIREMENTS_TXT: &str = "requirements.txt";
pub const LS_LINT_CONFIG: &str = ".ls-lint.yml";
}
pub mod rust {
pub const CARGO_TOML: &str = "Cargo.toml";
pub const CARGO_LOCK: &str = "Cargo.lock";
pub const MAIN_RS: &str = "src/main.rs";
pub const LIB_RS: &str = "src/lib.rs";
pub const BUILD_RS: &str = "build.rs";
pub const RUSTFMT_TOML: &str = "rustfmt.toml";
pub const CARGO_CONFIG_DIR: &str = ".cargo";
pub const CARGO_CONFIG: &str = ".cargo/config.toml";
}
pub mod model {
pub const ONNX_FILE: &str = "model.onnx";
pub const LABELS_FILE: &str = "labels.txt";
pub const CONFIG_FILE: &str = "config.json";
}
pub mod user {
use std::path::PathBuf;
pub const MECHA10_DIR: &str = ".mecha10";
pub const CREDENTIALS_FILE: &str = ".mecha10/credentials.json";
pub const TEMPLATES_DIR: &str = ".mecha10/templates";
pub const SIMULATION_DIR: &str = ".mecha10/simulation";
pub const SIMULATION_CURRENT: &str = ".mecha10/simulation/current";
pub const SIMULATION_VERSION: &str = ".mecha10/simulation/version";
pub const BIN_DIR: &str = ".mecha10/bin";
pub fn mecha10_dir() -> PathBuf {
dirs::home_dir().unwrap_or_else(|| PathBuf::from(".")).join(MECHA10_DIR)
}
pub fn credentials_file() -> PathBuf {
dirs::home_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join(CREDENTIALS_FILE)
}
pub fn templates_dir() -> PathBuf {
mecha10_dir().join("templates")
}
pub fn simulation_dir() -> PathBuf {
mecha10_dir().join("simulation")
}
pub fn simulation_current() -> PathBuf {
mecha10_dir().join("simulation/current")
}
pub fn bin_dir() -> PathBuf {
mecha10_dir().join("bin")
}
pub fn bin(name: &str) -> PathBuf {
bin_dir().join(name)
}
pub fn cargo_bin(name: &str) -> PathBuf {
dirs::home_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join(".cargo/bin")
.join(name)
}
pub fn local_bin(name: &str) -> PathBuf {
dirs::home_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join(".local/bin")
.join(name)
}
}
pub mod container {
pub const PROJECT_ROOT: &str = "/project";
pub const FRAMEWORK_ROOT: &str = "/mecha10";
pub const APP_ROOT: &str = "/app";
pub const REMOTE_CONFIG: &str = "/app/mecha10.json";
pub const FRAMEWORK_GODOT_PROJECT: &str = "/mecha10/packages/simulation/godot-project";
pub const FRAMEWORK_GODOT_PROJECT_LEGACY: &str = "/mecha10/godot-project";
pub fn project_path(relative: &str) -> String {
format!("{}/{}", PROJECT_ROOT, relative)
}
pub fn framework_path(relative: &str) -> String {
format!("{}/{}", FRAMEWORK_ROOT, relative)
}
}
pub mod framework {
pub const PACKAGES_DIR: &str = "packages";
pub const NODES_DIR: &str = "packages/nodes";
pub const DRIVERS_DIR: &str = "packages/drivers";
pub const SERVICES_DIR: &str = "packages/services";
pub const SIMULATION_DIR: &str = "packages/simulation";
pub const SIMULATION_GODOT_DIR: &str = "packages/simulation/godot-project";
pub const SIMULATION_MODELS_DIR: &str = "packages/simulation/models";
pub const SIMULATION_ENVIRONMENTS_DIR: &str = "packages/simulation/environments";
pub const ROBOT_TASKS_DIR: &str = "packages/simulation/environments/robot-tasks";
pub const ROBOT_TASKS_CATALOG: &str = "packages/simulation/environments/robot-tasks/catalog.json";
pub const TASKRUNNER_DIR: &str = "packages/taskrunner";
pub const RELEASE_BINARY: &str = "target/release/mecha10";
pub const DEBUG_BINARY: &str = "target/debug/mecha10";
pub const NODE_RUNNER_RELEASE: &str = "target/release/mecha10-node-runner";
pub const NODE_RUNNER_DEBUG: &str = "target/debug/mecha10-node-runner";
pub fn node_package(node_name: &str) -> String {
format!("packages/nodes/{}", node_name)
}
pub fn node_config(node_name: &str) -> String {
format!("packages/nodes/{}/configs/config.json", node_name)
}
pub fn node_lib_rs(node_name: &str) -> String {
format!("packages/nodes/{}/src/lib.rs", node_name)
}
}
pub mod urls {
pub const USER_TOOLS_REPO: &str = "mecha-industries/user-tools";
pub const REMOTE_MANIFEST: &str =
"https://raw.githubusercontent.com/mecha-industries/user-tools/main/mecha10-remote/manifest.json";
pub const AUTH_URL: &str = "https://mecha.industries/api/auth";
}
pub fn target_path(profile: &str, binary: &str) -> String {
format!("target/{}/{}", profile, binary)
}
pub fn target_path_with_triple(target: Option<&str>, profile: &str) -> String {
match target {
Some(t) => format!("target/{}/{}", t, profile),
None => format!("target/{}", profile),
}
}
pub fn find_project_root(start: &Path) -> Option<PathBuf> {
let mut current = start.to_path_buf();
loop {
if current.join(PROJECT_CONFIG).exists() {
return Some(current);
}
if !current.pop() {
return None;
}
}
}
pub fn is_project_dir(dir: &Path) -> bool {
dir.join(PROJECT_CONFIG).exists()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_config_paths() {
assert_eq!(
config::framework_node("object-detector"),
"configs/nodes/@mecha10/object-detector/config.json"
);
assert_eq!(
config::local_node("my-node"),
"configs/nodes/@local/my-node/config.json"
);
assert_eq!(config::project_node("camera"), "configs/nodes/camera/config.json");
}
#[test]
fn test_target_path() {
assert_eq!(target_path("release", "my-node"), "target/release/my-node");
assert_eq!(
target_path_with_triple(Some("aarch64-unknown-linux-gnu"), "release"),
"target/aarch64-unknown-linux-gnu/release"
);
assert_eq!(target_path_with_triple(None, "debug"), "target/debug");
}
#[test]
fn test_container_paths() {
assert_eq!(
container::project_path("configs/test.json"),
"/project/configs/test.json"
);
assert_eq!(container::framework_path("packages/core"), "/mecha10/packages/core");
}
}