use std::collections::HashMap;
use std::sync::Arc;
use std::sync::OnceLock;
use serde_json::Value;
use crate::Result;
use crate::config::Config;
use crate::direction::Destination;
use crate::flow_ctrl::FlowCtrl;
use crate::http::get_client;
use crate::plugin::Plugin;
use crate::rocket::Rocket;
use crate::shortcut::Shortcut;
static GLOBAL_CONFIG: OnceLock<Config> = OnceLock::new();
#[derive(Clone, Copy, Debug, Default)]
pub struct Artful;
impl Artful {
pub fn config(config: Config) -> bool {
GLOBAL_CONFIG.set(config).is_ok()
}
pub fn get_config() -> &'static Config {
GLOBAL_CONFIG.get_or_init(Config::default)
}
pub fn has_config() -> bool {
GLOBAL_CONFIG.get().is_some()
}
pub async fn artful(
params: HashMap<String, Value>,
plugins: Vec<Arc<dyn Plugin>>,
) -> Result<Destination> {
let mut rocket = Rocket::new(params);
let mut ctrl = FlowCtrl::new(plugins);
ctrl.call_next(&mut rocket).await?;
Ok(rocket.destination.unwrap_or_default())
}
pub async fn shortcut<S: Shortcut>(
shortcut: S,
params: HashMap<String, Value>,
) -> Result<Destination> {
let plugins = shortcut.get_plugins(¶ms);
Self::artful(params, plugins).await
}
pub async fn raw(request: reqwest::Request) -> Result<reqwest::Response> {
get_client()
.execute(request)
.await
.map_err(crate::error::ArtfulError::RequestFailed)
}
}