p5 0.10.0

A tui client for Pulumi
Documentation
use ratatui::{
    layout::Alignment,
    style::Style,
    widgets::{Block, Paragraph, StatefulWidget, Widget},
};

use crate::state::{AppContext, AppState, Loadable, StackContext};

use super::theme::color;

#[derive(Default, Clone)]
pub struct StackOutputs {}

impl StatefulWidget for StackOutputs {
    type State = AppState;

    fn render(
        self,
        area: ratatui::prelude::Rect,
        buf: &mut ratatui::prelude::Buffer,
        state: &mut Self::State,
    ) {
        let outputs = match state.stack_outputs() {
            Loadable::Loaded(outputs) => Some(
                serde_json::to_string_pretty(&outputs)
                    .unwrap_or_else(|_| "Failed to serialize outputs".to_string()),
            ),
            Loadable::Loading => Some("Loading Outputs...".to_string()),
            Loadable::NotLoaded => None,
        };

        if let Some(outputs) = outputs {
            let outputs_block = Block::bordered()
                .title("Outputs")
                .border_type(ratatui::widgets::BorderType::Rounded)
                .border_style(Style::default().fg(
                    if let AppContext::Stack(StackContext::Outputs) = state.background_context() {
                        color::BORDER_HIGHLIGHT
                    } else {
                        color::BORDER_DEFAULT
                    },
                ));

            let outputs_paragraph = Paragraph::new(outputs)
                .block(outputs_block)
                .alignment(Alignment::Left);

            outputs_paragraph.render(area, buf);
        }
    }
}