#![forbid(unsafe_code)]
#[allow(dead_code)]
pub struct AdapterBase {
pub base_url: String,
pub api_key: String,
pub client: reqwest::Client,
}
impl AdapterBase {
#[allow(dead_code)]
pub fn new(base_url: impl Into<String>, api_key: impl Into<String>) -> Self {
Self {
base_url: base_url.into().trim_end_matches('/').to_string(),
api_key: api_key.into(),
client: reqwest::Client::new(),
}
}
}
impl std::fmt::Debug for AdapterBase {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("AdapterBase")
.field("base_url", &self.base_url)
.field("api_key", &"[REDACTED]")
.finish_non_exhaustive()
}
}
#[must_use]
pub const fn pre_stream_error(
event: swink_agent::AssistantMessageEvent,
) -> [swink_agent::AssistantMessageEvent; 2] {
[swink_agent::AssistantMessageEvent::Start, event]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn trailing_slash_stripped() {
let base = AdapterBase::new("https://api.example.com/", "key");
assert_eq!(base.base_url, "https://api.example.com");
}
#[test]
fn multiple_trailing_slashes_stripped() {
let base = AdapterBase::new("https://api.example.com///", "key");
assert_eq!(base.base_url, "https://api.example.com");
}
#[test]
fn no_trailing_slash_unchanged() {
let base = AdapterBase::new("https://api.example.com", "key");
assert_eq!(base.base_url, "https://api.example.com");
}
#[test]
fn pre_stream_error_prefixes_start() {
let events = pre_stream_error(swink_agent::AssistantMessageEvent::error("boom"));
assert!(matches!(
events,
[
swink_agent::AssistantMessageEvent::Start,
swink_agent::AssistantMessageEvent::Error { .. }
]
));
}
}