1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Debug, Default, Deserialize, Serialize)]
5#[serde(deny_unknown_fields)]
6pub struct HttpTriggerConfig {
7 pub component: String,
9 pub route: HttpTriggerRouteConfig,
11 #[serde(default)]
13 pub executor: Option<HttpExecutorType>,
14}
15
16#[derive(Clone, Debug, Deserialize, Serialize)]
18#[serde(untagged)]
19pub enum HttpTriggerRouteConfig {
20 Route(String),
21 Private(HttpPrivateEndpoint),
22}
23
24#[derive(Clone, Debug, Default, Deserialize, Serialize)]
26#[serde(deny_unknown_fields)]
27pub struct HttpPrivateEndpoint {
28 pub private: bool,
30}
31
32impl Default for HttpTriggerRouteConfig {
33 fn default() -> Self {
34 Self::Route(Default::default())
35 }
36}
37
38impl<T: Into<String>> From<T> for HttpTriggerRouteConfig {
39 fn from(value: T) -> Self {
40 Self::Route(value.into())
41 }
42}
43
44#[derive(Clone, Debug, Default, Deserialize, Serialize)]
50#[serde(deny_unknown_fields, rename_all = "lowercase", tag = "type")]
51pub enum HttpExecutorType {
52 #[default]
56 #[serde(alias = "spin")]
57 Http,
58 Wagi(WagiTriggerConfig),
60}
61
62#[derive(Clone, Debug, Deserialize, Serialize)]
64#[serde(default, deny_unknown_fields)]
65pub struct WagiTriggerConfig {
66 #[serde(skip_serializing)]
68 pub entrypoint: String,
69
70 pub argv: String,
80}
81
82impl Default for WagiTriggerConfig {
83 fn default() -> Self {
84 const WAGI_DEFAULT_ENTRYPOINT: &str = "_start";
86 const WAGI_DEFAULT_ARGV: &str = "${SCRIPT_NAME} ${ARGS}";
87
88 Self {
89 entrypoint: WAGI_DEFAULT_ENTRYPOINT.to_owned(),
90 argv: WAGI_DEFAULT_ARGV.to_owned(),
91 }
92 }
93}
94
95#[cfg(test)]
96mod tests {
97 use super::*;
98
99 #[test]
100 fn wagi_config_smoke_test() {
101 let HttpExecutorType::Wagi(config) = toml::toml! { type = "wagi" }.try_into().unwrap()
102 else {
103 panic!("wrong type");
104 };
105 assert_eq!(config.entrypoint, "_start");
106 assert_eq!(config.argv, "${SCRIPT_NAME} ${ARGS}");
107 }
108}