espforge_lib/resolver/strategies/
component.rs1use 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#[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 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}