espforge_lib/resolver/strategies/
mod.rs

1use crate::config::{Esp32Config, PlatformConfig};
2use crate::manifest::ParameterType;
3use anyhow::Result;
4use espforge_macros::auto_register_param_strategy;
5use inventory;
6use serde_yaml_ng::Value;
7
8pub mod component;
9pub mod hardware;
10pub struct ResolutionContext<'a> {
11    pub platform: &'a PlatformConfig,
12    pub hardware: Option<&'a Esp32Config>,
13}
14
15pub trait ParameterStrategy: Send + Sync {
16    fn resolve(&self, value: &Value, ctx: &ResolutionContext) -> Result<Value>;
17}
18
19pub type StrategyFactory = fn() -> (ParameterType, Box<dyn ParameterStrategy>);
20
21pub struct StrategyRegistration {
22    pub factory: StrategyFactory,
23}
24
25inventory::collect!(StrategyRegistration);
26
27#[macro_export]
28macro_rules! register_strategy {
29    ($param_type:expr, $strategy:ty) => {
30        inventory::submit! {
31            $crate::resolver::strategies::StrategyRegistration {
32                factory: || ($param_type, Box::new(<$strategy>::default()))
33            }
34        }
35    };
36}
37
38#[derive(Default)]
39#[auto_register_param_strategy(
40    ParameterType::String,
41    ParameterType::Integer,
42    ParameterType::Boolean
43)]
44pub struct PrimitiveStrategy;
45
46impl ParameterStrategy for PrimitiveStrategy {
47    fn resolve(&self, value: &Value, _ctx: &ResolutionContext) -> Result<Value> {
48        Ok(value.clone())
49    }
50}