pub(super) fn render_swift_tool_calls_deep(root_expr: &str, tail: &str) -> String {
use heck::ToLowerCamelCase;
let segs = parse_tail(tail);
let mut expr = root_expr.to_string();
let mut prev_is_optional = false;
for seg in &segs {
match seg {
TailSeg::Index(n) => {
expr = format!("({expr})[{n}]");
prev_is_optional = false;
}
TailSeg::Field(f) => {
let prop = f.to_lower_camel_case();
let sep = if prev_is_optional { "?." } else { "." };
expr = format!("{expr}{sep}{prop}");
prev_is_optional = true;
}
}
}
expr
}
pub(super) fn render_rust_tool_calls_deep(chunks_var: &str, tail: &str) -> String {
let segs = parse_tail(tail);
let idx = segs.iter().find_map(|s| match s {
TailSeg::Index(n) => Some(*n),
_ => None,
});
let field_segs: Vec<&str> = segs
.iter()
.filter_map(|s| match s {
TailSeg::Field(f) => Some(f.as_str()),
_ => None,
})
.collect();
let base = format!(
"{chunks_var}.iter().flat_map(|c| c.choices.iter().flat_map(|ch| ch.delta.tool_calls.iter().flatten()))"
);
let with_nth = match idx {
Some(n) => format!("{base}.nth({n})"),
None => base,
};
let mut expr = with_nth;
for (i, f) in field_segs.iter().enumerate() {
let is_leaf = i == field_segs.len() - 1;
if is_leaf {
expr = format!("{expr}.and_then(|x| x.{f}.as_deref())");
} else {
expr = format!("{expr}.and_then(|x| x.{f}.as_ref())");
}
}
format!("{expr}.unwrap_or(\"\")")
}
#[derive(Debug, PartialEq)]
pub(super) enum TailSeg {
Index(usize),
Field(String),
}
pub(super) fn parse_tail(tail: &str) -> Vec<TailSeg> {
let mut segs = Vec::new();
let mut rest = tail;
while !rest.is_empty() {
if let Some(inner) = rest.strip_prefix('[') {
if let Some(close) = inner.find(']') {
let idx_str = &inner[..close];
if let Ok(idx) = idx_str.parse::<usize>() {
segs.push(TailSeg::Index(idx));
}
rest = &inner[close + 1..];
} else {
break;
}
} else if let Some(inner) = rest.strip_prefix('.') {
let end = inner.find(['.', '[']).unwrap_or(inner.len());
segs.push(TailSeg::Field(inner[..end].to_string()));
rest = &inner[end..];
} else {
break;
}
}
segs
}
pub(super) fn render_deep_tail(root_expr: &str, tail: &str, lang: &str) -> String {
use heck::{ToLowerCamelCase, ToPascalCase};
let segs = parse_tail(tail);
let mut out = root_expr.to_string();
for seg in &segs {
match (seg, lang) {
(TailSeg::Index(n), "rust") => {
out = format!("({out})[{n}]");
}
(TailSeg::Index(n), "java") => {
out = format!("({out}).get({n})");
}
(TailSeg::Index(n), "kotlin") => {
if *n == 0 {
out = format!("({out}).first()");
} else {
out = format!("({out}).get({n})");
}
}
(TailSeg::Index(n), "kotlin_android") => {
if *n == 0 {
out = format!("({out}).first()");
} else {
out = format!("({out})[{n}]");
}
}
(TailSeg::Index(n), "elixir") => {
out = format!("Enum.at({out}, {n})");
}
(TailSeg::Index(n), "zig") => {
out = format!("({out}).items[{n}]");
}
(TailSeg::Index(n), "php") => {
out = format!("({out})[{n}]");
}
(TailSeg::Index(n), _) => {
out = format!("({out})[{n}]");
}
(TailSeg::Field(f), "rust") => {
use heck::ToSnakeCase;
out.push('.');
out.push_str(&f.to_snake_case());
}
(TailSeg::Field(f), "go") => {
use crate::codegen::naming::to_go_name;
out.push('.');
out.push_str(&to_go_name(f));
}
(TailSeg::Field(f), "java") => {
out.push('.');
out.push_str(&f.to_lower_camel_case());
out.push_str("()");
}
(TailSeg::Field(f), "kotlin") => {
out.push_str("?.");
out.push_str(&f.to_lower_camel_case());
out.push_str("()");
}
(TailSeg::Field(f), "kotlin_android") => {
out.push_str("?.");
out.push_str(&f.to_lower_camel_case());
}
(TailSeg::Field(f), "csharp") => {
out.push('.');
out.push_str(&f.to_pascal_case());
}
(TailSeg::Field(f), "php") => {
out.push_str("->");
out.push_str(f);
}
(TailSeg::Field(f), "elixir") => {
out.push('.');
out.push_str(f);
}
(TailSeg::Field(f), "zig") => {
out.push('.');
out.push_str(f);
}
(TailSeg::Field(f), "python") | (TailSeg::Field(f), "ruby") => {
out.push('.');
out.push_str(f);
}
(TailSeg::Field(f), _) => {
out.push('.');
out.push_str(&f.to_lower_camel_case());
}
}
}
out
}