spin_runtime_factors/
build.rs

1use std::path::PathBuf;
2
3use super::{TriggerAppArgs, TriggerFactors, TriggerFactorsRuntimeConfig};
4
5use anyhow::Context as _;
6use spin_factors_executor::FactorsExecutor;
7use spin_runtime_config::ResolvedRuntimeConfig;
8use spin_trigger::cli::{
9    FactorsConfig, InitialKvSetterHook, KeyValueDefaultStoreSummaryHook, MaxInstanceMemoryHook,
10    RuntimeFactorsBuilder, SqlStatementExecutorHook, SqliteDefaultStoreSummaryHook,
11    StdioLoggingExecutorHooks,
12};
13
14/// A [`RuntimeFactorsBuilder`] for [`TriggerFactors`].
15pub struct FactorsBuilder;
16
17impl RuntimeFactorsBuilder for FactorsBuilder {
18    type CliArgs = TriggerAppArgs;
19    type Factors = TriggerFactors;
20    type RuntimeConfig = ResolvedRuntimeConfig<TriggerFactorsRuntimeConfig>;
21
22    fn build(
23        config: &FactorsConfig,
24        args: &Self::CliArgs,
25    ) -> anyhow::Result<(Self::Factors, Self::RuntimeConfig)> {
26        let runtime_config = ResolvedRuntimeConfig::<TriggerFactorsRuntimeConfig>::from_file(
27            config.runtime_config_file.clone().as_deref(),
28            config.local_app_dir.clone().map(PathBuf::from),
29            config.state_dir.clone(),
30            config.log_dir.clone(),
31        )?;
32
33        runtime_config.summarize(config.runtime_config_file.as_deref());
34
35        let factors = TriggerFactors::new(
36            runtime_config.state_dir(),
37            config.working_dir.clone(),
38            args.allow_transient_write,
39        )
40        .context("failed to create factors")?;
41        Ok((factors, runtime_config))
42    }
43
44    fn configure_app<U: Send + 'static>(
45        executor: &mut FactorsExecutor<Self::Factors, U>,
46        runtime_config: &Self::RuntimeConfig,
47        config: &FactorsConfig,
48        args: &Self::CliArgs,
49    ) -> anyhow::Result<()> {
50        executor.add_hooks(StdioLoggingExecutorHooks::new(
51            config.follow_components.clone(),
52            runtime_config.log_dir(),
53        ));
54        executor.add_hooks(SqlStatementExecutorHook::new(
55            args.sqlite_statements.clone(),
56        ));
57        executor.add_hooks(InitialKvSetterHook::new(args.key_values.clone()));
58        executor.add_hooks(SqliteDefaultStoreSummaryHook);
59        executor.add_hooks(KeyValueDefaultStoreSummaryHook);
60
61        let max_instance_memory = args
62            .max_instance_memory
63            .or(runtime_config.max_instance_memory());
64
65        // Only add the hook if a max instance memory size is specified via flag or runtime config.
66        if let Some(max_instance_memory) = max_instance_memory {
67            executor.add_hooks(MaxInstanceMemoryHook::new(max_instance_memory));
68        }
69
70        Ok(())
71    }
72}