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 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}