Skip to main content

evm_lens_core/storage/
resolver.rs

1use async_trait::async_trait;
2
3use super::layout::StorageLayout;
4
5#[async_trait]
6pub trait StorageLayoutResolver: Send + Sync {
7    async fn resolve(&self, input: &[u8]) -> color_eyre::Result<Option<StorageLayout>>;
8}
9
10/// Composite resolver that tries multiple resolvers in order and returns the first non-None
11/// layout. If none succeed, returns an empty layout.
12pub struct CompositeResolver {
13    resolvers: Vec<Box<dyn StorageLayoutResolver>>,
14}
15
16impl CompositeResolver {
17    pub fn new(resolvers: Vec<Box<dyn StorageLayoutResolver>>) -> Self {
18        Self { resolvers }
19    }
20
21    pub async fn resolve(&self, input: &[u8]) -> color_eyre::Result<StorageLayout> {
22        for r in &self.resolvers {
23            if let Some(l) = r.resolve(input).await? {
24                return Ok(l);
25            }
26        }
27        Ok(StorageLayout::new())
28    }
29}