casper-node 2.0.3

The Casper blockchain node
Documentation
use datasize::DataSize;

use super::{FetchItem, FetchResponder};

#[derive(Debug, DataSize)]
pub(crate) struct ItemHandle<T>
where
    T: FetchItem,
{
    validation_metadata: Box<T::ValidationMetadata>,
    responders: Vec<FetchResponder<T>>,
}

impl<T: FetchItem> ItemHandle<T> {
    pub(super) fn new(
        validation_metadata: Box<T::ValidationMetadata>,
        responder: FetchResponder<T>,
    ) -> Self {
        Self {
            validation_metadata,
            responders: vec![responder],
        }
    }

    pub(super) fn validation_metadata(&self) -> &T::ValidationMetadata {
        &self.validation_metadata
    }

    pub(super) fn push_responder(&mut self, responder: FetchResponder<T>) {
        self.responders.push(responder)
    }

    pub(super) fn pop_front_responder(&mut self) -> Option<FetchResponder<T>> {
        if self.responders.is_empty() {
            return None;
        }
        Some(self.responders.remove(0))
    }

    pub(super) fn take_responders(self) -> Vec<FetchResponder<T>> {
        self.responders
    }

    pub(super) fn has_no_responders(&self) -> bool {
        self.responders.is_empty()
    }
}