grafbase_sdk/test/
config.rs

1use std::{collections::HashMap, path::PathBuf};
2
3use serde::{Deserialize, Deserializer};
4
5pub(super) const GATEWAY_BINARY_NAME: &str = "grafbase-gateway";
6pub(super) const CLI_BINARY_NAME: &str = "grafbase";
7
8/// Log level for the test process output. Default value is `LogLevel::Error`.
9#[derive(Debug, Clone, Default)]
10pub enum LogLevel {
11    /// Show all output from traces upwards.
12    Trace,
13    /// Show all output from debug upwards.
14    Debug,
15    /// Show all output from info upwards.
16    #[default]
17    Info,
18    /// Show all output from warn upwards.
19    Warn,
20    /// Show only error messages.
21    Error,
22    /// Show all output from engine, debug upwards.
23    EngineDebug,
24    /// Extra verbose logs, show all output from engine, trace upwards.
25    EngineTrace,
26    /// Extra extra verbose logs
27    WasiDebug,
28    /// You know what you need
29    Custom(String),
30}
31
32impl AsRef<str> for LogLevel {
33    fn as_ref(&self) -> &str {
34        match self {
35            LogLevel::Trace => "trace",
36            LogLevel::Debug => "debug",
37            LogLevel::Info => "info",
38            LogLevel::Warn => "warn",
39            LogLevel::Error => "error",
40            LogLevel::EngineDebug => "engine=debug",
41            LogLevel::EngineTrace => "engine=trace",
42            LogLevel::WasiDebug => "wasi_component_loader=debug",
43            LogLevel::Custom(level) => level.as_str(),
44        }
45    }
46}
47
48impl From<String> for LogLevel {
49    fn from(level: String) -> Self {
50        LogLevel::Custom(level)
51    }
52}
53
54impl From<&str> for LogLevel {
55    fn from(level: &str) -> Self {
56        level.to_string().into()
57    }
58}
59
60#[derive(Debug, serde::Deserialize)]
61pub(super) struct ExtensionToml {
62    pub extension: ExtensionDefinition,
63}
64
65#[derive(Debug, serde::Deserialize)]
66pub(super) struct ExtensionDefinition {
67    pub name: String,
68}
69
70#[derive(Debug, serde::Serialize, serde::Deserialize)]
71pub(super) struct GatewayToml {
72    #[serde(default)]
73    pub extensions: HashMap<String, ExtensionConfig>,
74    #[serde(default)]
75    pub wasm: WasmConfig,
76    #[serde(flatten)]
77    pub rest: toml::Table,
78}
79
80#[derive(Default, Clone, Debug, serde::Serialize, serde::Deserialize)]
81#[serde(default, deny_unknown_fields)]
82pub struct WasmConfig {
83    pub cache_path: Option<PathBuf>,
84}
85
86#[derive(Debug)]
87pub(super) enum ExtensionConfig {
88    Version(String),
89    Structured(StructuredExtensionConfig),
90}
91
92impl<'de> Deserialize<'de> for ExtensionConfig {
93    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
94    where
95        D: Deserializer<'de>,
96    {
97        use serde::de::{Error, MapAccess, Visitor, value::MapAccessDeserializer};
98        struct ExtensionConfigVisitor;
99
100        impl<'de> Visitor<'de> for ExtensionConfigVisitor {
101            type Value = ExtensionConfig;
102
103            fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
104                formatter.write_str("a version or a config map")
105            }
106
107            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
108            where
109                E: Error,
110            {
111                value.parse().map(ExtensionConfig::Version).map_err(Error::custom)
112            }
113
114            fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
115            where
116                M: MapAccess<'de>,
117            {
118                StructuredExtensionConfig::deserialize(MapAccessDeserializer::new(&mut map))
119                    .map(ExtensionConfig::Structured)
120            }
121        }
122
123        deserializer.deserialize_any(ExtensionConfigVisitor)
124    }
125}
126
127impl serde::Serialize for ExtensionConfig {
128    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
129    where
130        S: serde::Serializer,
131    {
132        match self {
133            ExtensionConfig::Version(version) => serializer.serialize_str(version),
134            ExtensionConfig::Structured(config) => config.serialize(serializer),
135        }
136    }
137}
138
139#[derive(Debug, serde::Serialize, serde::Deserialize)]
140pub(super) struct StructuredExtensionConfig {
141    pub version: Option<String>,
142    pub path: Option<String>,
143    #[serde(flatten)]
144    pub rest: toml::Table,
145}