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 ComponentRefStrategy;
12
13impl ParameterStrategy for ComponentRefStrategy {
14    fn resolve(&self, value: &Value, _ctx: &ResolutionContext) -> Result<Value> {
15        let ref_name = self.extract_name(value)?;
16        Ok(Value::String(ref_name.to_string()))
17    }
18}
19
20impl ComponentRefStrategy {
21    fn extract_name<'a>(&self, value: &'a Value) -> Result<&'a str> {
22        let val_str = value
23            .as_str()
24            .ok_or_else(|| anyhow!("Component reference must be a string"))?;
25
26        val_str
27            .strip_prefix('$')
28            .ok_or_else(|| anyhow!("Component reference must start with '$', got: {}", val_str))
29    }
30}