Skip to main content

adk_ui/a2ui/
bindings.rs

1use serde::{Deserialize, Serialize};
2
3/// A2UI-friendly dynamic string binding.
4///
5/// - `Literal` embeds a fixed string.
6/// - `Path` references a data model path (e.g. "/user/name").
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
8#[serde(rename_all = "camelCase")]
9pub enum DynamicString {
10    #[serde(rename = "literalString")]
11    Literal(String),
12    #[serde(rename = "path")]
13    Path(String),
14}
15
16impl DynamicString {
17    pub fn literal(value: impl Into<String>) -> Self {
18        Self::Literal(value.into())
19    }
20
21    pub fn path(value: impl Into<String>) -> Self {
22        Self::Path(value.into())
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    use serde_json::json;
30
31    #[test]
32    fn serializes_literal_string() {
33        let value = DynamicString::literal("hello");
34        let serialized = serde_json::to_value(&value).unwrap();
35        assert_eq!(serialized, json!({ "literalString": "hello" }));
36    }
37
38    #[test]
39    fn serializes_path_string() {
40        let value = DynamicString::path("/user/name");
41        let serialized = serde_json::to_value(&value).unwrap();
42        assert_eq!(serialized, json!({ "path": "/user/name" }));
43    }
44}