espforge_lib/resolver/strategies/
component.rs

1use crate::manifest::ParameterType;
2use crate::register_strategy;
3use crate::resolver::strategies::{ParameterStrategy, ResolutionContext};
4use anyhow::{Result, anyhow};
5use espforge_macros::auto_register_param_strategy;
6use serde_yaml_ng::Value;
7
8/// Strategy for resolving I2C Component references.
9#[derive(Default)]
10#[auto_register_param_strategy(ParameterType::I2cComponentRef, ParameterType::SpiComponentRef)]
11pub struct I2CComponentRefStrategy;
12
13impl ParameterStrategy for I2CComponentRefStrategy {
14    fn resolve(&self, value: &Value, _ctx: &ResolutionContext) -> Result<Value> {
15        let ref_name = self.extract_name(value)?;
16
17        // Return the variable name string
18        Ok(Value::String(ref_name.to_string()))
19    }
20}
21
22impl I2CComponentRefStrategy {
23    fn extract_name<'a>(&self, value: &'a Value) -> Result<&'a str> {
24        let val_str = value
25            .as_str()
26            .ok_or_else(|| anyhow!("Component reference must be a string"))?;
27
28        val_str
29            .strip_prefix('$')
30            .ok_or_else(|| anyhow!("Component reference must start with '$', got: {}", val_str))
31    }
32}