sk-store 2.1.0

SimKube trace store library
Documentation
use std::collections::VecDeque;
use std::ops::Index;

use sk_core::prelude::*;
use tracing::*;

use crate::{
    TraceAction,
    TraceEvent,
};

#[derive(Clone, Default)]
pub struct TraceEventList(VecDeque<TraceEvent>);

impl TraceEventList {
    pub(crate) fn append(&mut self, ts: i64, obj: &DynamicObject, action: TraceAction) {
        info!(
            "{:?} @ {ts}: {} {}",
            action,
            obj.types
                .clone()
                .map(|tm| format!("{}.{}", tm.api_version, tm.kind))
                .unwrap_or("<unknown type>".into()),
            obj.namespaced_name(),
        );

        let obj = obj.clone();
        match self.0.back_mut() {
            Some(evt) if evt.ts == ts => match action {
                TraceAction::ObjectApplied => evt.applied_objs.push(obj),
                TraceAction::ObjectDeleted => evt.deleted_objs.push(obj),
            },
            _ => {
                let evt = match action {
                    TraceAction::ObjectApplied => TraceEvent { ts, applied_objs: vec![obj], ..Default::default() },
                    TraceAction::ObjectDeleted => TraceEvent { ts, deleted_objs: vec![obj], ..Default::default() },
                };
                self.0.push_back(evt);
            },
        }
    }

    pub(crate) fn back(&self) -> Option<&TraceEvent> {
        self.0.back()
    }

    pub(crate) fn front(&self) -> Option<&TraceEvent> {
        self.0.front()
    }

    pub(crate) fn is_empty(&self) -> bool {
        self.0.is_empty()
    }

    pub(crate) fn len(&self) -> usize {
        self.0.len()
    }
}

impl Index<usize> for TraceEventList {
    type Output = TraceEvent;

    fn index(&self, i: usize) -> &Self::Output {
        &self.0[i]
    }
}

impl From<VecDeque<TraceEvent>> for TraceEventList {
    fn from(v: VecDeque<TraceEvent>) -> TraceEventList {
        TraceEventList(v)
    }
}

impl From<Vec<TraceEvent>> for TraceEventList {
    fn from(v: Vec<TraceEvent>) -> TraceEventList {
        TraceEventList(v.into())
    }
}

impl FromIterator<TraceEvent> for TraceEventList {
    fn from_iter<T: IntoIterator<Item = TraceEvent>>(ii: T) -> Self {
        TraceEventList(ii.into_iter().collect())
    }
}