forest-filecoin 0.33.8

Rust Filecoin implementation.
Documentation
// Copyright 2019-2026 ChainSafe Systems
// SPDX-License-Identifier: Apache-2.0, MIT

use crate::{
    blocks::TipsetKey,
    db::{EthMappingsStore, SettingsStore, SettingsStoreExt as _},
    prelude::*,
};

pub fn write_bin<DB>(db: &DB)
where
    DB: SettingsStore,
{
    let key = "1";
    let value = [1];
    db.write_bin(key, &value).unwrap();
}

pub fn read_bin<DB>(db: &DB)
where
    DB: SettingsStore,
{
    let key = "0";
    let value = [1];
    db.write_bin(key, &value).unwrap();
    let res = db.read_bin(key).unwrap().unwrap();
    assert_eq!(value.as_ref(), res.as_slice());
}

pub fn write_read_obj<DB>(db: &DB)
where
    DB: SettingsStore,
{
    let key = "Cthulhu";
    let value = 42;
    db.write_obj(key, &value).unwrap();
    let res: i32 = db.read_obj(key).unwrap().unwrap();
    assert_eq!(value, res);

    // ensure that we are able to overwrite the value.
    // this is to ensure we don't enable settings such as
    // `preimage` for the settings column which would
    // assume that the value is immutable.
    let value = 1337;
    db.write_obj(key, &value).unwrap();
    let res: i32 = db.read_obj(key).unwrap().unwrap();
    assert_eq!(value, res);
}

pub fn exists<DB>(db: &DB)
where
    DB: SettingsStore,
{
    let key = "0";
    let value = [1];
    db.write_bin(key, &value).unwrap();
    let res = db.exists(key).unwrap();
    assert!(res);
}

pub fn does_not_exist<DB>(db: &DB)
where
    DB: SettingsStore,
{
    let key = "Azathoth";

    assert!(!db.exists(key).unwrap());
    assert!(db.read_obj::<i32>(key).unwrap().is_none());
    assert!(db.require_obj::<i32>(key).is_err());
}

pub fn tipset_lookup_read_write_delete<DB>(db: &DB)
where
    DB: EthMappingsStore,
{
    let tsk = TipsetKey::from(nunny::vec![Cid::default()]);
    let epoch = 0;

    // read from empty db should fail
    assert_eq!(db.tipset_key_by_epoch(epoch).unwrap(), None);

    // write should succeed
    db.set_tipset_key_at_epoch_raw(epoch, &tsk).unwrap();

    // read after write should succeed
    assert_eq!(db.tipset_key_by_epoch(epoch).unwrap().as_ref(), Some(&tsk));

    // delete should succed
    db.delete_tipset_key_at_epoch(epoch).unwrap();

    // read after delete from empty db should fail
    assert_eq!(db.tipset_key_by_epoch(epoch).unwrap(), None);

    // delete again should succed
    db.delete_tipset_key_at_epoch(epoch).unwrap();
}