use std::collections::HashMap;
use crate::{
config::{Config, DeployStrategy},
error::ServerlessError,
serializer::{Serializer, get_default_serializer},
transport::{Transport, get_default_transport},
};
pub struct Client {
config: Config,
transport: Box<dyn Transport>,
serializer: Serializer,
}
impl Client {
pub fn new() -> Result<Self, ServerlessError> {
let config = Config::from_env();
let serializer = get_default_serializer();
let transport = get_default_transport(config.timeout, config.retries);
Ok(Self {
config,
transport,
serializer,
})
}
pub fn with_config(config: Config) -> Result<Self, ServerlessError> {
let serializer = get_default_serializer();
let transport = get_default_transport(config.timeout, config.retries);
Ok(Self {
config,
transport,
serializer,
})
}
pub async fn call_function(
&self,
function_name: &str,
payload: Vec<u8>,
headers: Option<HashMap<String, String>>,
) -> Result<Vec<u8>, ServerlessError> {
match self.config.deploy_strategy() {
DeployStrategy::Remote => self.transport.call(function_name, payload, headers).await,
DeployStrategy::Local => Err(ServerlessError::Generic(
"Local call mode should not reach client runtime".into(),
)),
DeployStrategy::Mock => Ok(b"{}".to_vec()),
}
}
#[must_use]
pub fn transport(&self) -> &dyn Transport {
self.transport.as_ref()
}
#[must_use]
pub fn serializer(&self) -> &Serializer {
&self.serializer
}
}
impl Default for Client {
fn default() -> Self {
Self::new().expect("Failed to create default Client")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_client_default() {
let client = Client::default();
assert_eq!(client.config.base_url, "http://localhost:3000");
}
}