prns-core 0.3.4

Pure Reticulum engine and wire contract for Personal Reticulum
use crate::identity::destination_identity::{DestinationIdentityRecord, DestinationIdentityTable};
use crate::identity::{DestinationIdentityRetentionState, IdentityPublicKeys};
use crate::routing::announce::stored::{AnnounceAppData, AnnounceAppDataError, AppDataHandle};
use crate::storage::TablePushError;
use crate::units::InstantMillis;
use crate::wire::DestinationHash;

#[derive(Debug, Clone, Copy, Default)]
pub struct NoDestinationIdentityTable;

impl DestinationIdentityTable for NoDestinationIdentityTable {
    fn capacity(&self) -> usize {
        0
    }

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

    fn destinations(&self) -> &[DestinationHash] {
        &[]
    }

    fn public_keys(&self) -> &[IdentityPublicKeys] {
        &[]
    }

    fn announced_at(&self) -> &[InstantMillis] {
        &[]
    }

    fn retention(&self) -> &[DestinationIdentityRetentionState] {
        &[]
    }

    fn app_data_handles(&self) -> &[AppDataHandle] {
        &[]
    }

    fn set_row(&mut self, _: usize, _: DestinationIdentityRecord) {}

    fn push(
        &mut self,
        _: DestinationHash,
        _: DestinationIdentityRecord,
    ) -> Result<usize, TablePushError> {
        Err(TablePushError::TableFull)
    }

    fn swap_remove(&mut self, _: usize) {}
}

#[derive(Debug, Clone, Copy, Default)]
pub struct NoDestinationIdentityAppData;

impl AnnounceAppData for NoDestinationIdentityAppData {
    fn get(&self, _: AppDataHandle) -> &[u8] {
        &[]
    }

    fn insert(&mut self, _: &[u8]) -> Result<AppDataHandle, AnnounceAppDataError> {
        Err(AnnounceAppDataError::TooManyEntries)
    }

    fn replace(&mut self, _: AppDataHandle, _: &[u8]) -> Result<(), AnnounceAppDataError> {
        Err(AnnounceAppDataError::TooManyEntries)
    }

    fn free(&mut self, _: AppDataHandle) {}
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::identity::destination_identity::DestinationIdentities;

    #[test]
    fn disabled_destination_identity_storage_is_zero_sized() {
        assert_eq!(core::mem::size_of::<NoDestinationIdentityTable>(), 0);
        assert_eq!(core::mem::size_of::<NoDestinationIdentityAppData>(), 0);
        assert_eq!(
            core::mem::size_of::<
                DestinationIdentities<NoDestinationIdentityTable, NoDestinationIdentityAppData>,
            >(),
            0,
        );
    }
}