Skip to main content

forest/db/
either.rs

1// Copyright 2019-2026 ChainSafe Systems
2// SPDX-License-Identifier: Apache-2.0, MIT
3
4use super::*;
5
6pub enum Either<A: Blockstore, B: Blockstore> {
7    Left(A),
8    Right(B),
9}
10
11impl<A: Blockstore, B: Blockstore> Blockstore for Either<A, B> {
12    fn has(&self, k: &Cid) -> anyhow::Result<bool> {
13        match self {
14            Self::Left(v) => v.has(k),
15            Self::Right(v) => v.has(k),
16        }
17    }
18
19    #[allow(clippy::disallowed_types)]
20    fn put<D>(
21        &self,
22        mh_code: multihash_codetable::Code,
23        block: &fvm_ipld_blockstore::Block<D>,
24    ) -> anyhow::Result<Cid>
25    where
26        Self: Sized,
27        D: AsRef<[u8]>,
28    {
29        match self {
30            Self::Left(v) => v.put(mh_code, block),
31            Self::Right(v) => v.put(mh_code, block),
32        }
33    }
34
35    #[allow(clippy::disallowed_types)]
36    fn put_many<D, I>(&self, blocks: I) -> anyhow::Result<()>
37    where
38        Self: Sized,
39        D: AsRef<[u8]>,
40        I: IntoIterator<Item = (multihash_codetable::Code, fvm_ipld_blockstore::Block<D>)>,
41    {
42        match self {
43            Self::Left(v) => v.put_many(blocks),
44            Self::Right(v) => v.put_many(blocks),
45        }
46    }
47
48    fn put_many_keyed<D, I>(&self, blocks: I) -> anyhow::Result<()>
49    where
50        Self: Sized,
51        D: AsRef<[u8]>,
52        I: IntoIterator<Item = (Cid, D)>,
53    {
54        match self {
55            Self::Left(v) => v.put_many_keyed(blocks),
56            Self::Right(v) => v.put_many_keyed(blocks),
57        }
58    }
59
60    fn get(&self, k: &Cid) -> anyhow::Result<Option<Vec<u8>>> {
61        match self {
62            Self::Left(v) => v.get(k),
63            Self::Right(v) => v.get(k),
64        }
65    }
66
67    fn put_keyed(&self, k: &Cid, block: &[u8]) -> anyhow::Result<()> {
68        match self {
69            Self::Left(v) => v.put_keyed(k, block),
70            Self::Right(v) => v.put_keyed(k, block),
71        }
72    }
73}