#[derive(
Debug,
Clone,
Default,
PartialEq,
Eq,
serde::Serialize,
serde::Deserialize,
schemars::JsonSchema,
)]
#[schemars(rename = "cli.command.RequestBase")]
pub struct RequestBase {
pub jq: Option<String>,
pub python: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub timeout_seconds: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[schemars(extend("omitempty" = true))]
pub max_tokens: Option<u64>,
}
impl RequestBase {
pub fn push_flags(&self, argv: &mut Vec<String>) {
if let Some(jq) = &self.jq {
argv.push("--jq".to_string());
argv.push(jq.clone());
}
if let Some(python) = &self.python {
argv.push("--python".to_string());
argv.push(python.clone());
}
if let Some(secs) = self.timeout_seconds {
argv.push("--timeout".to_string());
argv.push(
humantime::format_duration(std::time::Duration::from_secs(secs)).to_string(),
);
}
if let Some(n) = self.max_tokens {
argv.push("--max-tokens".to_string());
argv.push(n.to_string());
}
}
pub fn clear_transform(&mut self) {
self.jq = None;
self.python = None;
}
pub fn transform(&self) -> Option<Transform> {
if let Some(code) = &self.python {
Some(Transform::Python(code.clone()))
} else {
self.jq.as_ref().map(|filter| Transform::Jq(filter.clone()))
}
}
pub fn set_transform(&mut self, transform: Transform) {
self.clear_transform();
match transform {
Transform::Jq(filter) => self.jq = Some(filter),
Transform::Python(code) => self.python = Some(code),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Transform {
Jq(String),
Python(String),
}
#[derive(clap::Args)]
pub struct RequestBaseArgs {
#[arg(long)]
pub jq: Option<String>,
#[arg(long)]
pub python: Option<String>,
#[arg(long, value_parser = parse_timeout_seconds)]
pub timeout: Option<u64>,
#[arg(long, value_parser = parse_max_tokens)]
pub max_tokens: Option<u64>,
}
fn parse_timeout_seconds(s: &str) -> Result<u64, String> {
let duration = humantime::parse_duration(s).map_err(|e| e.to_string())?;
match duration.as_secs() {
0 => Err("must be >= 1s".to_string()),
secs => Ok(secs),
}
}
fn parse_max_tokens(s: &str) -> Result<u64, String> {
match s.parse::<u64>().map_err(|e| e.to_string())? {
0 => Err("must be >= 1 (omit the flag for unlimited)".to_string()),
n => Ok(n),
}
}
impl From<RequestBaseArgs> for RequestBase {
fn from(args: RequestBaseArgs) -> Self {
Self {
jq: args.jq,
python: args.python,
timeout_seconds: args.timeout,
max_tokens: args.max_tokens,
}
}
}