jarq 0.8.3

An interactive jq-like JSON query tool with a TUI
Documentation
//! Input loading state management.

use std::sync::Arc;

use simd_json::OwnedValue as Value;

use crate::error::LoadError;
use crate::loader::Loader;

pub enum LoadingState {
    Loading,
    Ready,
    Failed(LoadError),
}

pub struct InputState {
    values: Option<Arc<Vec<Value>>>,
    state: LoadingState,
    loader: Option<Loader>,
}

impl InputState {
    pub fn new(loader: Loader) -> Self {
        Self {
            values: None,
            state: LoadingState::Loading,
            loader: Some(loader),
        }
    }

    #[cfg(test)]
    pub fn ready(values: Vec<Value>) -> Self {
        Self {
            values: Some(Arc::new(values)),
            state: LoadingState::Ready,
            loader: None,
        }
    }

    /// Poll for loading completion. Returns true if loading just completed.
    pub fn poll(&mut self) -> bool {
        let Some(ref loader) = self.loader else {
            return false;
        };

        let Some(result) = loader.try_recv() else {
            return false;
        };

        self.loader = None;
        match result.result {
            Ok(values) => {
                self.values = Some(Arc::new(values));
                self.state = LoadingState::Ready;
            }
            Err(e) => {
                self.state = LoadingState::Failed(e);
            }
        }
        true
    }

    pub fn values(&self) -> Option<&Arc<Vec<Value>>> {
        self.values.as_ref()
    }

    pub fn state(&self) -> &LoadingState {
        &self.state
    }

    pub fn count(&self) -> usize {
        self.values.as_ref().map(|v| v.len()).unwrap_or(0)
    }
}