use std::path::PathBuf;
use std::sync::Arc;
use relayburn_sdk::{ingest_opencode_sessions, Ledger, LedgerOpenOptions, RawIngestOptions};
use super::pending_stamp::{self, IngestSessionsFn, PendingStampAdapter};
use super::HarnessAdapter;
fn opencode_sessions_dir() -> PathBuf {
let home = std::env::var_os("HOME")
.map(PathBuf::from)
.unwrap_or_else(|| PathBuf::from("."));
home.join(".local")
.join("share")
.join("opencode")
.join("storage")
.join("session")
}
pub fn config() -> PendingStampAdapter {
let session_root: Arc<dyn Fn() -> PathBuf + Send + Sync> = Arc::new(opencode_sessions_dir);
let ingest_sessions: IngestSessionsFn = Arc::new(|ledger_home| {
Box::pin(async move {
let ledger_opts = match ledger_home.as_deref() {
Some(home) => LedgerOpenOptions::with_home(home),
None => LedgerOpenOptions::default(),
};
let mut handle = Ledger::open(ledger_opts)?;
let opts = RawIngestOptions {
ledger_home,
..RawIngestOptions::default()
};
ingest_opencode_sessions(handle.raw_mut(), &opts).await
})
});
PendingStampAdapter::new("opencode", session_root, ingest_sessions)
}
pub fn adapter() -> &'static dyn HarnessAdapter {
pending_stamp::adapter_static(config())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::harnesses::test_env::with_test_home;
#[test]
fn config_has_opencode_name() {
let cfg = config();
assert_eq!(cfg.name, "opencode");
with_test_home("/tmp/burn-opencode-test-home", || {
let resolved = (cfg.session_root)();
assert_eq!(
resolved,
PathBuf::from(
"/tmp/burn-opencode-test-home/.local/share/opencode/storage/session"
)
);
});
}
#[test]
fn adapter_round_trip() {
let a: &'static dyn HarnessAdapter = adapter();
assert_eq!(a.name(), "opencode");
with_test_home("/tmp/burn-opencode-test-home", || {
assert_eq!(
a.session_root(),
PathBuf::from(
"/tmp/burn-opencode-test-home/.local/share/opencode/storage/session"
)
);
});
}
}