jk 0.2.6

A jj-native terminal UI for Jujutsu
use jk_cli::{DiffQuery, JjDiff, JjLog, JjShow, JjStatus, JjWorkspaces, ShowQuery, StatusQuery};
use jk_core::{CommandHistory, CommandSource, SourceAction, SourceView};
use jk_tui::diff_view::DiffView;
use jk_tui::log_view::LogView;
use jk_tui::rendered_view::RenderedView;
use jk_tui::workspaces_view::{WorkspaceViewSnapshot, WorkspacesView};

use crate::runner::recording_runner;
use crate::state::AppView;
use crate::workspaces::workspace_view_snapshot;

pub fn root_log_view(source: &JjLog, history: &mut CommandHistory) -> color_eyre::Result<AppView> {
    let mut runner = recording_runner(
        history,
        CommandSource::new(SourceView::Log, SourceAction::InitialLoad),
    );
    let entries = source.load_with_runner(&mut runner)?;
    Ok(AppView::Log(LogView::new(entries)))
}

pub fn root_diff_view(
    diff_source: &JjDiff,
    query: DiffQuery,
    history: &mut CommandHistory,
) -> AppView {
    let mut runner = recording_runner(
        history,
        CommandSource::new(SourceView::Diff, SourceAction::InitialLoad),
    );
    let snapshot = diff_source.load_query_with_runner(&query, &mut runner);
    let diff = match snapshot {
        Ok(snapshot) => DiffView::new(snapshot),
        Err(error) => DiffView::from_error(
            query.target_label(),
            diff_source.spec_for(&query).title().to_owned(),
            error.to_string(),
        ),
    };
    AppView::Diff { view: diff, query }
}

pub fn root_show_view(
    show_source: &JjShow,
    query: ShowQuery,
    history: &mut CommandHistory,
) -> AppView {
    let mut runner = recording_runner(
        history,
        CommandSource::new(SourceView::Show, SourceAction::InitialLoad),
    );
    let snapshot = show_source.load_query_with_runner(&query, &mut runner);
    let show = match snapshot {
        Ok(snapshot) => RenderedView::new(snapshot),
        Err(error) => RenderedView::from_error(
            query.target_label(),
            show_source.spec_for(&query).title().to_owned(),
            error.to_string(),
        ),
    };
    AppView::Show { view: show, query }
}

pub fn root_status_view(
    status_source: &JjStatus,
    query: StatusQuery,
    history: &mut CommandHistory,
) -> AppView {
    let mut runner = recording_runner(
        history,
        CommandSource::new(SourceView::Status, SourceAction::InitialLoad),
    );
    let snapshot = status_source.load_query_with_runner(&query, &mut runner);
    let status = match snapshot {
        Ok(snapshot) => RenderedView::new(snapshot),
        Err(error) => RenderedView::from_error(
            query.target_label(),
            status_source.spec_for(&query).title().to_owned(),
            error.to_string(),
        ),
    };
    AppView::Status {
        view: status,
        query,
    }
}

pub fn root_workspaces_view(
    workspaces_source: &JjWorkspaces,
    history: &mut CommandHistory,
) -> AppView {
    let mut runner = recording_runner(
        history,
        CommandSource::new(SourceView::Workspaces, SourceAction::InitialLoad),
    );
    let view = match workspaces_source.load_list_with_runner(&mut runner) {
        Ok(snapshot) => WorkspacesView::new(workspace_view_snapshot(snapshot)),
        Err(error) => {
            let mut view = WorkspacesView::new(WorkspaceViewSnapshot::new(Vec::new()));
            view.show_error(error.to_string());
            view
        }
    };
    AppView::Workspaces { view }
}