use anyhow::{Result, bail};
use colored::Colorize;
use crate::client::post_graphql;
use crate::config::Configs;
use crate::gql::queries;
pub async fn ensure_enabled(client: &reqwest::Client, configs: &Configs) -> Result<()> {
let flags = match post_graphql::<queries::CloudAgentAccess, _>(
client,
configs.get_backboard(),
queries::cloud_agent_access::Variables {},
)
.await
{
Ok(data) => data.me.feature_flags,
Err(_) => return Ok(()),
};
if has_cloud_agents(&flags) {
return Ok(());
}
super::telemetry::track_access_blocked().await;
bail!(not_enabled_message(configs.get_host()));
}
fn has_cloud_agents(flags: &[queries::cloud_agent_access::ActiveFeatureFlag]) -> bool {
use queries::cloud_agent_access::ActiveFeatureFlag;
flags
.iter()
.any(|flag| matches!(flag, ActiveFeatureFlag::CLOUD_AGENTS))
}
fn not_enabled_message(host: &str) -> String {
format!(
"Cloud agents are not enabled for your account yet.\n\n {} Turn on {} in Priority Boarding:\n {}\n\nThen run this command again.",
"→".cyan(),
"Cloud Agents".bold(),
format!("https://{host}/account/feature-flags").underline()
)
}
#[cfg(test)]
mod tests {
use super::*;
use queries::cloud_agent_access::ActiveFeatureFlag;
#[test]
fn the_flag_is_matched_exactly() {
assert!(has_cloud_agents(&[
ActiveFeatureFlag::PRIORITY_BOARDING,
ActiveFeatureFlag::CLOUD_AGENTS,
]));
assert!(!has_cloud_agents(&[ActiveFeatureFlag::PRIORITY_BOARDING]));
assert!(!has_cloud_agents(&[]));
assert!(!has_cloud_agents(&[ActiveFeatureFlag::Other(
"CLOUD_AGENTS_V2".into()
)]));
}
#[test]
fn the_message_points_at_the_flag_and_the_page() {
let message = not_enabled_message("railway.com");
assert!(message.contains("Priority Boarding"), "{message}");
assert!(
message.contains("https://railway.com/account/feature-flags"),
"{message}"
);
}
}