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,
}
}
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)
}
}