use crate::prelude::*;
use beet_core::prelude::*;
use beet_flow::prelude::*;
use beet_rsx::prelude::*;
#[derive(Debug, Default, Clone, Resource)]
pub struct LambdaConfig {
pub region: Option<String>,
pub iam_role: Option<String>,
}
#[construct]
pub fn CompileLambda(entity: Entity) -> impl Bundle {
(
Name::new("Compile Lambda"),
ContinueRun,
OnSpawn::observe(
move |ev: On<GetOutcome>,
mut cmd_runner: CommandRunner,
query: AncestorQuery<&'static CargoBuildCmd>| {
let cargo_cmd = query
.get(entity)
.cloned()
.unwrap_or_default()
.cmd("build")
.no_default_features()
.feature("server-lambda");
let mut cmd_config = CommandConfig::new("cargo").arg("lambda");
for arg in cargo_cmd.get_args() {
cmd_config = cmd_config.arg(arg);
}
#[cfg(target_arch = "aarch64")]
{
cmd_config = cmd_config
.env("CARGO_BUILD_TARGET", "aarch64-unknown-linux-gnu");
}
cmd_config = cmd_config
.arg("--lambda-dir")
.arg("target/lambda/crates")
.arg("--target")
.arg("x86_64-unknown-linux-gnu");
cmd_runner.run(ev, cmd_config)
},
),
)
}
#[construct]
pub fn DeployLambda() -> impl Bundle {
(
Name::new("Deploy Lambda"),
ContinueRun,
OnSpawn::observe(
|ev: On<GetOutcome>,
mut cmd_runner: CommandRunner,
workspace_config: Res<WorkspaceConfig>,
lambda_config: Res<LambdaConfig>,
pkg_config: Res<PackageConfig>| {
let binary_name = pkg_config.binary_name();
let snippets_dir = workspace_config
.snippets_dir()
.to_string();
let mut config = CommandConfig::new("cargo")
.arg("lambda")
.arg("deploy")
.arg("--enable-function-url")
.arg("--include")
.arg(&snippets_dir)
.arg("--lambda-dir")
.arg("target/lambda/crates")
.arg("--binary-name")
.arg(binary_name);
let vars = env_ext::vars_filtered(
GlobFilter::default().with_include("OPENAI_API_KEY"),
);
if !vars.is_empty() {
config = config.arg("--env-var").arg(
vars.into_iter()
.map(|(key, value)| format!("{key}={value}"))
.collect::<Vec<_>>()
.join(","),
);
}
if let Some(iam_role) = &lambda_config.iam_role {
config = config.arg("--iam-role").arg(iam_role);
}
if let Some(region) = &lambda_config.region {
config = config.arg("--region").arg(region);
};
let lambda_name = pkg_config.router_lambda_name();
config = config.arg(&lambda_name);
cmd_runner.run(ev, config)
},
),
)
}
#[construct]
pub fn WatchLambda() -> impl Bundle {
(
Name::new("Watch Lambda"),
OnSpawn::observe(
|ev: On<GetOutcome>,
mut cmd_runner: CommandRunner,
pkg_config: Res<PackageConfig>| {
let lambda_name = pkg_config.router_lambda_name();
let config = CommandConfig::new("aws")
.arg("logs")
.arg("tail")
.arg(format!("/aws/lambda/{lambda_name}"))
.arg("--format")
.arg("short") .arg("--since")
.arg("2m")
.arg("--follow");
cmd_runner.run(ev, config)
},
),
)
}