#[derive(Debug, Clone, Default)]
pub struct FullArgSpec {
pub args: Vec<String>,
pub varargs: Option<String>,
pub varkw: Option<String>,
pub defaults: Vec<String>, pub kwonlyargs: Vec<String>,
}
pub fn getconfigargspec(_obj_name: &str) -> FullArgSpec {
FullArgSpec::default()
}
pub fn formatconfigargspec(args: &[String], defaults: &[String]) -> String {
let mut specs: Vec<String> = Vec::new();
let firstdefault = if !defaults.is_empty() {
Some(args.len().saturating_sub(defaults.len()))
} else {
None
};
for (i, arg) in args.iter().enumerate() {
let mut spec = arg.clone();
if let Some(fd) = firstdefault {
if i >= fd {
spec.push('=');
spec.push_str(&defaults[i - fd]);
}
}
specs.push(spec);
}
format!("({})", specs.join(", "))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn formatconfigargspec_empty_args() {
assert_eq!(formatconfigargspec(&[], &[]), "()");
}
#[test]
fn formatconfigargspec_args_without_defaults() {
let args = vec!["a".to_string(), "b".to_string(), "c".to_string()];
assert_eq!(formatconfigargspec(&args, &[]), "(a, b, c)");
}
#[test]
fn formatconfigargspec_args_with_trailing_defaults() {
let args = vec!["a".to_string(), "b".to_string(), "c".to_string()];
let defaults = vec!["1".to_string(), "2".to_string()];
assert_eq!(formatconfigargspec(&args, &defaults), "(a, b=1, c=2)");
}
#[test]
fn formatconfigargspec_all_args_default() {
let args = vec!["x".to_string(), "y".to_string()];
let defaults = vec!["10".to_string(), "20".to_string()];
assert_eq!(formatconfigargspec(&args, &defaults), "(x=10, y=20)");
}
#[test]
fn formatconfigargspec_one_arg_one_default() {
let args = vec!["only".to_string()];
let defaults = vec!["'hello'".to_string()];
assert_eq!(formatconfigargspec(&args, &defaults), "(only='hello')");
}
#[test]
fn getconfigargspec_returns_empty_until_registry_lands() {
let spec = getconfigargspec("dummy");
assert!(spec.args.is_empty());
assert!(spec.defaults.is_empty());
}
}