magi-code 0.96.1

Repository-aware CLI coding agent for terminal work
Documentation
use super::*;

impl MissionControlState {
    pub(super) fn active_modal_field_mut(&mut self) -> Option<&mut SingleLineField> {
        let connect = self.modals.connect_provider.as_mut()?;
        match connect.stage {
            ConnectProviderStage::ConfigureCustom => connect.current_field_mut(),
            ConnectProviderStage::OAuth if connect.oauth_focus == OAuthControl::Fallback => {
                Some(&mut connect.fallback_input)
            }
            _ => None,
        }
    }

    pub(super) fn finish_modal_field_edit(&mut self) {
        if let Some(connect) = &mut self.modals.connect_provider
            && connect.stage == ConnectProviderStage::ConfigureCustom
        {
            connect.error = None;
            if connect.selected_field == ConnectProviderField::Label {
                connect.provider_id =
                    crate::config::derive_custom_provider_id(connect.label.value()).ok();
            }
        }
    }

    pub(super) fn reject_secret_like_api_key_env_var(&mut self, text: &str) -> bool {
        let Some(connect) = &mut self.modals.connect_provider else {
            return false;
        };
        if connect.stage != ConnectProviderStage::ConfigureCustom
            || connect.selected_field != ConnectProviderField::ApiKeyEnvVar
        {
            return false;
        }
        let mut candidate = connect.api_key_env_var.clone();
        candidate.insert_str(text);
        if crate::config::looks_like_secret_value(candidate.value()) {
            connect.error = Some(
                "API key environment variable name looks like a secret value; enter a variable name such as CUSTOM_PROVIDER_API_KEY".to_string(),
            );
            true
        } else {
            false
        }
    }

    pub(crate) fn insert_modal_field_char(&mut self, ch: char) {
        if self.reject_secret_like_api_key_env_var(&ch.to_string()) {
            return;
        }
        if self
            .active_modal_field_mut()
            .is_some_and(|field| field.insert_char(ch))
        {
            self.finish_modal_field_edit();
        }
    }

    pub(crate) fn insert_modal_field_text(&mut self, text: &str) -> bool {
        if self.reject_secret_like_api_key_env_var(text) {
            return false;
        }
        let changed = self
            .active_modal_field_mut()
            .is_some_and(|field| field.insert_str(text));
        if changed {
            self.finish_modal_field_edit();
        }
        changed
    }

    pub(crate) fn backspace_modal_field(&mut self) {
        if self
            .active_modal_field_mut()
            .is_some_and(SingleLineField::backspace)
        {
            self.finish_modal_field_edit();
        }
    }

    pub(crate) fn delete_modal_field_forward(&mut self) {
        if self
            .active_modal_field_mut()
            .is_some_and(SingleLineField::delete_forward)
        {
            self.finish_modal_field_edit();
        }
    }

    pub(crate) fn move_modal_field_left(&mut self) {
        if let Some(field) = self.active_modal_field_mut() {
            field.move_left();
        }
    }

    pub(crate) fn move_modal_field_right(&mut self) {
        if let Some(field) = self.active_modal_field_mut() {
            field.move_right();
        }
    }

    pub(crate) fn move_modal_field_home(&mut self) {
        if let Some(field) = self.active_modal_field_mut() {
            field.move_home();
        }
    }

    pub(crate) fn move_modal_field_end(&mut self) {
        if let Some(field) = self.active_modal_field_mut() {
            field.move_end();
        }
    }
}