//! ContextFlag flags are for behaviors that need to be conditionally enabled or disabled based //! on where the app is being run and are a permanent part of the app. use std::str::FromStr; use std::sync::atomic::{AtomicBool, Ordering}; use enum_iterator::{cardinality, Sequence}; use crate::channel::ChannelState; /// All ContextFlag flag are enabled by default. Environments can conditionally disable flags. /// /// Aside from manually setting specific flags in dogfood contexts, the complete list of contexts /// this is used in is found in the ContextFlag impl. #[derive(Copy, Clone, Hash, PartialEq, Eq, Debug, Sequence)] pub enum ContextFlag { CreateSharedSession, CreateNewSession, CloseWindow, ForceSidePanelOpen, ShowRewardModal, HideOpenOnDesktopButton, PromptForVersionUpdates, NetworkLogConsole, RunWorkflow, LaunchConfigurations, WarpEssentials, AllowSettingsModalToClose, ShowSlowShellStartupBanner, DynamicBrowserUrl, ShowMCPServers, } /// The enablement states for context flags. As mentioned in the documentation /// for [`ContextFlag`], these are enabled by default. static FLAG_STATES: [AtomicBool; cardinality::()] = [const { AtomicBool::new(true) }; { cardinality::() }]; fn disable_flag(flag: ContextFlag) { FLAG_STATES[flag as usize].store(false, Ordering::Relaxed); } impl ContextFlag { pub fn is_enabled(&self) -> bool { FLAG_STATES[*self as usize].load(Ordering::Relaxed) } /// Sets a ContextFlag flag. FOR DEBUG USE ONLY. pub fn set(&self, value: bool) { if !ChannelState::enable_debug_features() { log::error!( "Tried to set value of `ContextFlag` flag `{self:?}` in non-dogfood context." ); } FLAG_STATES[*self as usize].store(value, Ordering::Relaxed); } pub fn set_warp_home_link_only() { disable_flag(Self::ForceSidePanelOpen); disable_flag(Self::ShowRewardModal); disable_flag(Self::HideOpenOnDesktopButton); disable_flag(Self::RunWorkflow); disable_flag(Self::CreateSharedSession); disable_flag(Self::CreateNewSession); disable_flag(Self::CloseWindow); disable_flag(Self::PromptForVersionUpdates); disable_flag(Self::WarpEssentials); disable_flag(Self::NetworkLogConsole); disable_flag(Self::ShowMCPServers); } pub fn set_settings_link_only() { disable_flag(Self::ForceSidePanelOpen); disable_flag(Self::ShowRewardModal); disable_flag(Self::HideOpenOnDesktopButton); disable_flag(Self::RunWorkflow); disable_flag(Self::CreateSharedSession); disable_flag(Self::CreateNewSession); disable_flag(Self::CloseWindow); disable_flag(Self::PromptForVersionUpdates); disable_flag(Self::WarpEssentials); disable_flag(Self::NetworkLogConsole); disable_flag(Self::AllowSettingsModalToClose); disable_flag(Self::ShowSlowShellStartupBanner); disable_flag(Self::DynamicBrowserUrl); disable_flag(Self::ShowMCPServers); } pub fn set_warp_drive_link_only() { disable_flag(Self::ForceSidePanelOpen); disable_flag(Self::ShowRewardModal); disable_flag(Self::HideOpenOnDesktopButton); disable_flag(Self::RunWorkflow); disable_flag(Self::CreateSharedSession); disable_flag(Self::CreateNewSession); disable_flag(Self::CloseWindow); disable_flag(Self::PromptForVersionUpdates); disable_flag(Self::WarpEssentials); disable_flag(Self::NetworkLogConsole); disable_flag(Self::ShowMCPServers); } // ContextFlag flag sets: pub fn set_shared_session_only() { disable_flag(Self::CreateSharedSession); disable_flag(Self::CreateNewSession); disable_flag(Self::CloseWindow); disable_flag(Self::ForceSidePanelOpen); disable_flag(Self::ShowRewardModal); disable_flag(Self::HideOpenOnDesktopButton); disable_flag(Self::PromptForVersionUpdates); disable_flag(Self::NetworkLogConsole); disable_flag(Self::LaunchConfigurations); disable_flag(Self::WarpEssentials); disable_flag(Self::ShowMCPServers); } pub fn set_conversation_only() { disable_flag(Self::CreateSharedSession); disable_flag(Self::CreateNewSession); disable_flag(Self::CloseWindow); disable_flag(Self::ForceSidePanelOpen); disable_flag(Self::ShowRewardModal); disable_flag(Self::HideOpenOnDesktopButton); disable_flag(Self::PromptForVersionUpdates); disable_flag(Self::NetworkLogConsole); disable_flag(Self::LaunchConfigurations); disable_flag(Self::WarpEssentials); disable_flag(Self::ShowMCPServers); disable_flag(Self::RunWorkflow); } } impl FromStr for ContextFlag { type Err = (); fn from_str(s: &str) -> Result { match s { "CreateSharedSession" => Ok(Self::CreateSharedSession), "CreateNewSession" => Ok(Self::CreateNewSession), "CloseWindow" => Ok(Self::CloseWindow), "ForceSidePanelOpen" => Ok(Self::ForceSidePanelOpen), "ShowRewardModal" => Ok(Self::ShowRewardModal), "HideOpenOnDesktopButton" => Ok(Self::HideOpenOnDesktopButton), "PromptForVersionUpdates" => Ok(Self::PromptForVersionUpdates), "NetworkLogConsole" => Ok(Self::NetworkLogConsole), "RunWorkflow" => Ok(Self::RunWorkflow), "LaunchConfigurations" => Ok(Self::LaunchConfigurations), "WarpEssentials" => Ok(Self::WarpEssentials), _ => Err(()), } } }