use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicU64, Ordering};
include!(concat!(env!("OUT_DIR"), "/builtins_gen.rs"));
static EXPAND_SEQ: AtomicU64 = AtomicU64::new(0);
#[must_use]
pub fn versioned_dir(base: &Path) -> PathBuf {
base.join(format!("v{}", env!("CARGO_PKG_VERSION")))
.join("components")
}
pub fn ensure_expanded(base_dir: &Path) -> Result<Vec<PathBuf>, std::io::Error> {
let target = versioned_dir(base_dir);
if target.exists() {
return Ok(vec![]);
}
let parent = target.parent().ok_or_else(|| {
std::io::Error::new(std::io::ErrorKind::InvalidInput, "target has no parent")
})?;
std::fs::create_dir_all(parent)?;
let seq = EXPAND_SEQ.fetch_add(1, Ordering::Relaxed);
let pid = std::process::id();
let staging = parent.join(format!("components.staging.{pid}.{seq}"));
let written = write_all(&staging)?;
match std::fs::rename(&staging, &target) {
Ok(()) => Ok(written),
Err(e) if target.exists() => {
let _ = std::fs::remove_dir_all(&staging);
let _ = e;
Ok(vec![])
}
Err(e) => {
let _ = std::fs::remove_dir_all(&staging);
Err(e)
}
}
}
pub fn force_expand(base_dir: &Path) -> Result<Vec<PathBuf>, std::io::Error> {
let target = versioned_dir(base_dir);
if target.exists() {
std::fs::remove_dir_all(&target)?;
}
write_all(&target)
}
fn write_all(target: &Path) -> Result<Vec<PathBuf>, std::io::Error> {
let mut written = Vec::new();
for (rel_path, content) in FILES {
let dest = target.join(rel_path);
if let Some(parent) = dest.parent() {
std::fs::create_dir_all(parent)?;
}
std::fs::write(&dest, content)?;
written.push(dest);
}
Ok(written)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn files_is_not_empty() {
assert!(
!FILES.is_empty(),
"build.rs should have generated at least one entry"
);
}
#[test]
fn files_contains_echo() {
let has_echo = FILES.iter().any(|(path, _)| *path == "echo.lua");
assert!(has_echo, "builtins should include echo.lua");
}
#[test]
fn files_contains_skill_manager_init() {
let has = FILES
.iter()
.any(|(path, _)| *path == "skill_manager/init.lua");
assert!(has, "builtins should include skill_manager/init.lua");
}
#[test]
fn files_contains_mcp_manager_init() {
let has = FILES
.iter()
.any(|(path, _)| *path == "mcp_manager/init.lua");
assert!(has, "builtins should include mcp_manager/init.lua");
}
#[test]
fn versioned_dir_includes_version() {
let dir = versioned_dir(Path::new("/base"));
let dir_str = dir.to_string_lossy();
assert!(
dir_str.contains(env!("CARGO_PKG_VERSION")),
"should contain crate version: {dir_str}"
);
assert!(
dir_str.ends_with("components"),
"should end with components: {dir_str}"
);
}
#[test]
fn ensure_expanded_creates_files() {
let wd = orcs_runtime::WorkDir::temporary().expect("should create temp WorkDir");
let written = ensure_expanded(wd.path()).expect("expansion should succeed");
assert_eq!(written.len(), FILES.len(), "should write all files");
let sm_init = versioned_dir(wd.path()).join("skill_manager/init.lua");
assert!(sm_init.exists(), "skill_manager/init.lua should exist");
}
#[test]
fn ensure_expanded_skips_existing_version() {
let wd = orcs_runtime::WorkDir::temporary().expect("should create temp WorkDir");
ensure_expanded(wd.path()).expect("first expansion");
let second = ensure_expanded(wd.path()).expect("second expansion");
assert!(second.is_empty(), "should skip existing version");
}
#[test]
fn force_expand_overwrites_existing() {
let wd = orcs_runtime::WorkDir::temporary().expect("should create temp WorkDir");
let first = ensure_expanded(wd.path()).expect("initial expansion");
assert_eq!(first.len(), FILES.len(), "should write all files initially");
let echo_path = versioned_dir(wd.path()).join("echo.lua");
std::fs::write(&echo_path, "-- tampered").expect("should write tamper");
let tampered = std::fs::read_to_string(&echo_path).expect("should read tampered");
assert_eq!(tampered, "-- tampered");
let forced = force_expand(wd.path()).expect("force expansion");
assert_eq!(forced.len(), FILES.len(), "should write all files again");
let restored = std::fs::read_to_string(&echo_path).expect("should read restored");
assert_ne!(
restored, "-- tampered",
"tampered file should be overwritten"
);
}
#[test]
fn force_expand_works_on_empty_dir() {
let wd = orcs_runtime::WorkDir::temporary().expect("should create temp WorkDir");
let written = force_expand(wd.path()).expect("force expansion on empty");
assert_eq!(written.len(), FILES.len(), "should write all files");
let sm_init = versioned_dir(wd.path()).join("skill_manager/init.lua");
assert!(sm_init.exists(), "skill_manager/init.lua should exist");
}
}