use crate::models::versioning::{ToolkitVersion, ToolkitVersionParam, ToolkitVersions};
use std::collections::HashMap;
use std::env;
pub fn get_toolkit_versions(
default_versions: Option<ToolkitVersionParam>,
) -> ToolkitVersionParam {
if let Some(ToolkitVersionParam::Latest) = default_versions {
return ToolkitVersionParam::Latest;
}
let toolkit_versions_from_env = get_versions_from_env();
let user_provided_toolkit_versions: ToolkitVersions = match default_versions {
Some(ToolkitVersionParam::Versions(map)) => map,
_ => HashMap::new(),
};
let mut toolkit_versions = toolkit_versions_from_env;
toolkit_versions.extend(user_provided_toolkit_versions);
if toolkit_versions.is_empty() {
return ToolkitVersionParam::Latest;
}
ToolkitVersionParam::Versions(toolkit_versions)
}
pub fn get_toolkit_version(
toolkit_slug: &str,
toolkit_versions: Option<&ToolkitVersionParam>,
) -> ToolkitVersion {
if let Some(ToolkitVersionParam::Latest) = toolkit_versions {
return ToolkitVersion::Latest;
}
if let Some(ToolkitVersionParam::Versions(map)) = toolkit_versions {
if let Some(version) = map.get(toolkit_slug) {
return version.clone();
}
}
ToolkitVersion::Latest
}
pub fn merge_toolkit_versions(
default: Option<ToolkitVersionParam>,
override_versions: Option<ToolkitVersionParam>,
) -> ToolkitVersionParam {
match (default, override_versions) {
(_, Some(override_val)) => override_val,
(Some(default_val), None) => default_val,
(None, None) => ToolkitVersionParam::None,
}
}
pub fn get_versions_from_env() -> ToolkitVersions {
let mut versions = HashMap::new();
for (key, value) in env::vars() {
if let Some(toolkit) = key.strip_prefix("COMPOSIO_TOOLKIT_VERSION_") {
versions.insert(toolkit.to_lowercase(), ToolkitVersion::from(value));
}
}
versions
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_toolkit_version_default() {
let version = get_toolkit_version("github", None);
assert_eq!(version.as_str(), "latest");
}
#[test]
fn test_get_toolkit_version_from_config_latest() {
let config = Some(ToolkitVersionParam::Latest);
let version = get_toolkit_version("github", config.as_ref());
assert_eq!(version.as_str(), "latest");
}
#[test]
fn test_get_toolkit_version_from_config_versions() {
let mut versions = HashMap::new();
versions.insert(
"github".to_string(),
ToolkitVersion::Specific("20250906_01".to_string()),
);
let config = Some(ToolkitVersionParam::Versions(versions));
let version = get_toolkit_version("github", config.as_ref());
assert_eq!(version.as_str(), "20250906_01");
}
#[test]
fn test_get_toolkit_version_from_config_none() {
let config = Some(ToolkitVersionParam::None);
let version = get_toolkit_version("github", config.as_ref());
assert_eq!(version.as_str(), "latest");
}
#[test]
fn test_get_toolkit_version_not_in_config() {
let mut versions = HashMap::new();
versions.insert(
"gmail".to_string(),
ToolkitVersion::Specific("20250906_01".to_string()),
);
let config = Some(ToolkitVersionParam::Versions(versions));
let version = get_toolkit_version("github", config.as_ref());
assert_eq!(version.as_str(), "latest");
}
#[test]
fn test_get_toolkit_versions_default() {
let versions = get_toolkit_versions(None);
assert!(versions.is_latest());
}
#[test]
fn test_get_toolkit_versions_with_latest() {
let versions = get_toolkit_versions(Some(ToolkitVersionParam::Latest));
assert!(versions.is_latest());
}
#[test]
fn test_get_toolkit_versions_with_user_versions() {
let mut user_versions = HashMap::new();
user_versions.insert(
"github".to_string(),
ToolkitVersion::Specific("20250906_01".to_string()),
);
let versions = get_toolkit_versions(Some(ToolkitVersionParam::Versions(user_versions)));
assert!(versions.is_versions());
if let ToolkitVersionParam::Versions(map) = versions {
assert_eq!(map.get("github").unwrap().as_str(), "20250906_01");
}
}
#[test]
fn test_get_toolkit_versions_from_env() {
env::set_var("COMPOSIO_TOOLKIT_VERSION_GITHUB", "20250906_01");
env::set_var("COMPOSIO_TOOLKIT_VERSION_GMAIL", "20250801_01");
let versions = get_toolkit_versions(None);
assert!(versions.is_versions());
if let ToolkitVersionParam::Versions(map) = versions {
assert_eq!(map.get("github").unwrap().as_str(), "20250906_01");
assert_eq!(map.get("gmail").unwrap().as_str(), "20250801_01");
}
env::remove_var("COMPOSIO_TOOLKIT_VERSION_GITHUB");
env::remove_var("COMPOSIO_TOOLKIT_VERSION_GMAIL");
}
#[test]
fn test_get_toolkit_versions_user_overrides_env() {
env::set_var("COMPOSIO_TOOLKIT_VERSION_GITHUB", "20250801_01");
let mut user_versions = HashMap::new();
user_versions.insert(
"github".to_string(),
ToolkitVersion::Specific("20250906_01".to_string()),
);
let versions = get_toolkit_versions(Some(ToolkitVersionParam::Versions(user_versions)));
assert!(versions.is_versions());
if let ToolkitVersionParam::Versions(map) = versions {
assert_eq!(map.get("github").unwrap().as_str(), "20250906_01");
}
env::remove_var("COMPOSIO_TOOLKIT_VERSION_GITHUB");
}
#[test]
fn test_get_toolkit_versions_merge_env_and_user() {
env::set_var("COMPOSIO_TOOLKIT_VERSION_GMAIL", "20250801_01");
let mut user_versions = HashMap::new();
user_versions.insert(
"github".to_string(),
ToolkitVersion::Specific("20250906_01".to_string()),
);
let versions = get_toolkit_versions(Some(ToolkitVersionParam::Versions(user_versions)));
assert!(versions.is_versions());
if let ToolkitVersionParam::Versions(map) = versions {
assert_eq!(map.get("github").unwrap().as_str(), "20250906_01");
assert_eq!(map.get("gmail").unwrap().as_str(), "20250801_01");
}
env::remove_var("COMPOSIO_TOOLKIT_VERSION_GMAIL");
}
#[test]
fn test_merge_toolkit_versions_override_takes_precedence() {
let default = Some(ToolkitVersionParam::Latest);
let override_config = Some(ToolkitVersionParam::None);
let merged = merge_toolkit_versions(default, override_config);
assert!(merged.is_none());
}
#[test]
fn test_merge_toolkit_versions_use_default() {
let default = Some(ToolkitVersionParam::Latest);
let override_config = None;
let merged = merge_toolkit_versions(default, override_config);
assert!(merged.is_latest());
}
#[test]
fn test_merge_toolkit_versions_both_none() {
let merged = merge_toolkit_versions(None, None);
assert!(merged.is_none());
}
#[test]
fn test_get_versions_from_env() {
env::set_var("COMPOSIO_TOOLKIT_VERSION_GITHUB", "20250906_01");
env::set_var("COMPOSIO_TOOLKIT_VERSION_GMAIL", "latest");
env::set_var("COMPOSIO_TOOLKIT_VERSION_SLACK", "20250801_01");
let versions = get_versions_from_env();
assert_eq!(versions.len(), 3);
assert_eq!(
versions.get("github").map(|v| v.as_str()),
Some("20250906_01")
);
assert_eq!(versions.get("gmail").map(|v| v.as_str()), Some("latest"));
assert_eq!(
versions.get("slack").map(|v| v.as_str()),
Some("20250801_01")
);
env::remove_var("COMPOSIO_TOOLKIT_VERSION_GITHUB");
env::remove_var("COMPOSIO_TOOLKIT_VERSION_GMAIL");
env::remove_var("COMPOSIO_TOOLKIT_VERSION_SLACK");
}
#[test]
fn test_get_versions_from_env_case_insensitive() {
env::set_var("COMPOSIO_TOOLKIT_VERSION_GITHUB", "20250906_01");
let versions = get_versions_from_env();
assert!(versions.contains_key("github"));
assert!(!versions.contains_key("GITHUB"));
env::remove_var("COMPOSIO_TOOLKIT_VERSION_GITHUB");
}
}