ggen_cli_lib/cmds/
helpers.rs1use clap_noun_verb::Result;
10use log::debug;
11use serde_json::Value;
12use std::future::Future;
13use std::time::{Duration, Instant};
14
15const CLI_OP_TIMEOUT: Duration = Duration::from_secs(10);
17
18pub const DEFAULT_MAX_TOKENS: i64 = 1024;
20
21pub const DEFAULT_TEMPERATURE: f64 = 0.7;
23
24pub const DEFAULT_SEARCH_LIMIT: usize = 50;
26
27pub const DEFAULT_SEARCH_OFFSET: usize = 0;
29
30pub const DEFAULT_REGISTRY_CAPACITY: u64 = 1000;
32
33pub fn execute_async_op<T, Fut>(op_name: &str, fut: Fut) -> Result<T>
38where
39 Fut: Future<Output = Result<T>>,
40{
41 tokio::task::block_in_place(|| {
42 tokio::runtime::Handle::current().block_on(async {
43 match tokio::time::timeout(CLI_OP_TIMEOUT, fut).await {
44 Ok(result) => result,
45 Err(_) => Err(clap_noun_verb::NounVerbError::execution_error(format!(
46 "Operation '{}' timed out after {}s",
47 op_name,
48 CLI_OP_TIMEOUT.as_secs()
49 ))),
50 }
51 })
52 })
53}
54
55pub fn log_operation(location: &str, message: &str, data: Value) {
60 debug!(
61 target: "ggen::cli",
62 "location={location} message={message} payload={}",
63 data
64 );
65}
66
67pub fn track_duration(_op_name: &str) -> DurationGuard {
72 DurationGuard {
73 start: Instant::now(),
74 }
75}
76
77pub struct DurationGuard {
79 start: Instant,
80}
81
82impl DurationGuard {
83 pub fn elapsed(&self) -> Duration {
85 self.start.elapsed()
86 }
87
88 pub fn elapsed_ms(&self) -> u64 {
90 self.elapsed().as_millis() as u64
91 }
92}
93
94impl Drop for DurationGuard {
95 fn drop(&mut self) {
96 }
98}