grafbase_sdk/test/
config.rs1use std::collections::HashMap;
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#[derive(Debug, Clone, Default)]
10pub enum LogLevel {
11 Trace,
13 Debug,
15 #[default]
17 Info,
18 Warn,
20 Error,
22 EngineDebug,
24 EngineTrace,
26 WasiDebug,
28 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(flatten)]
75 pub rest: toml::Table,
76}
77
78#[derive(Debug)]
79pub(super) enum ExtensionConfig {
80 Version(String),
81 Structured(StructuredExtensionConfig),
82}
83
84impl<'de> Deserialize<'de> for ExtensionConfig {
85 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
86 where
87 D: Deserializer<'de>,
88 {
89 use serde::de::{Error, MapAccess, Visitor, value::MapAccessDeserializer};
90 struct ExtensionConfigVisitor;
91
92 impl<'de> Visitor<'de> for ExtensionConfigVisitor {
93 type Value = ExtensionConfig;
94
95 fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
96 formatter.write_str("a version or a config map")
97 }
98
99 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
100 where
101 E: Error,
102 {
103 value.parse().map(ExtensionConfig::Version).map_err(Error::custom)
104 }
105
106 fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
107 where
108 M: MapAccess<'de>,
109 {
110 StructuredExtensionConfig::deserialize(MapAccessDeserializer::new(&mut map))
111 .map(ExtensionConfig::Structured)
112 }
113 }
114
115 deserializer.deserialize_any(ExtensionConfigVisitor)
116 }
117}
118
119impl serde::Serialize for ExtensionConfig {
120 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
121 where
122 S: serde::Serializer,
123 {
124 match self {
125 ExtensionConfig::Version(version) => serializer.serialize_str(version),
126 ExtensionConfig::Structured(config) => config.serialize(serializer),
127 }
128 }
129}
130
131#[derive(Debug, serde::Serialize, serde::Deserialize)]
132pub(super) struct StructuredExtensionConfig {
133 pub version: Option<String>,
134 pub path: Option<String>,
135 #[serde(flatten)]
136 pub rest: toml::Table,
137}