Skip to main content

gitkraft_gui/features/stash/
update.rs

1//! Update logic for stash-related messages.
2
3use iced::Task;
4
5use crate::message::Message;
6use crate::state::GitKraft;
7
8use super::commands;
9
10/// Handle all stash-related messages, returning a [`Task`] for any follow-up
11/// async work.
12pub fn update(state: &mut GitKraft, message: Message) -> Task<Message> {
13    match message {
14        Message::StashMessageChanged(msg) => {
15            state.active_tab_mut().stash_message = msg;
16            Task::none()
17        }
18
19        Message::StashSave => {
20            // Derive the optional stash message before the macro borrows state.
21            let msg = {
22                let tab = state.active_tab();
23                if tab.stash_message.trim().is_empty() {
24                    None
25                } else {
26                    Some(tab.stash_message.trim().to_string())
27                }
28            };
29            with_repo!(state, loading, "Saving stash…".into(), |repo_path| {
30                state.active_tab_mut().stash_message.clear();
31                commands::stash_save(repo_path, msg)
32            })
33        }
34
35        Message::StashPop(index) => with_repo!(
36            state,
37            loading,
38            format!("Popping stash@{{{index}}}…"),
39            |repo_path| commands::stash_pop(repo_path, index)
40        ),
41
42        Message::StashDrop(index) => with_repo!(
43            state,
44            loading,
45            format!("Dropping stash@{{{index}}}…"),
46            |repo_path| commands::stash_drop(repo_path, index)
47        ),
48
49        Message::StashUpdated(result) => {
50            state.active_tab_mut().is_loading = false;
51            match result {
52                Ok(stashes) => {
53                    {
54                        let tab = state.active_tab_mut();
55                        tab.stashes = stashes;
56                        tab.status_message = Some("Stash updated.".into());
57                    }
58                    state.refresh_active_tab()
59                }
60                Err(e) => {
61                    let tab = state.active_tab_mut();
62                    tab.error_message = Some(format!("Stash operation failed: {e}"));
63                    tab.status_message = None;
64                    Task::none()
65                }
66            }
67        }
68
69        _ => Task::none(),
70    }
71}