use clap_noun_verb::Result;
use log::debug;
use serde_json::Value;
use std::future::Future;
use std::time::{Duration, Instant};
const CLI_OP_TIMEOUT: Duration = Duration::from_secs(10);
pub const DEFAULT_MAX_TOKENS: i64 = 1024;
pub const DEFAULT_TEMPERATURE: f64 = 0.7;
pub const DEFAULT_SEARCH_LIMIT: usize = 50;
pub const DEFAULT_SEARCH_OFFSET: usize = 0;
pub const DEFAULT_REGISTRY_CAPACITY: u64 = 1000;
pub fn execute_async_op<T, Fut>(op_name: &str, fut: Fut) -> Result<T>
where
Fut: Future<Output = Result<T>>,
{
tokio::task::block_in_place(|| {
tokio::runtime::Handle::current().block_on(async {
match tokio::time::timeout(CLI_OP_TIMEOUT, fut).await {
Ok(result) => result,
Err(_) => Err(clap_noun_verb::NounVerbError::execution_error(format!(
"Operation '{}' timed out after {}s",
op_name,
CLI_OP_TIMEOUT.as_secs()
))),
}
})
})
}
pub fn log_operation(location: &str, message: &str, data: Value) {
debug!(
target: "ggen::cli",
"location={location} message={message} payload={}",
data
);
}
pub fn track_duration(_op_name: &str) -> DurationGuard {
DurationGuard {
start: Instant::now(),
}
}
pub struct DurationGuard {
start: Instant,
}
impl DurationGuard {
pub fn elapsed(&self) -> Duration {
self.start.elapsed()
}
pub fn elapsed_ms(&self) -> u64 {
self.elapsed().as_millis() as u64
}
}
impl Drop for DurationGuard {
fn drop(&mut self) {
}
}