gemini_client_api/gemini/utils/
macros.rs1use serde_json::{Value, json};
2
3pub trait GeminiSchema {
5 fn gemini_schema() -> Value;
6 fn name(gemini_schema: &Value) -> Option<&str> {
7 gemini_schema["name"].as_str()
8 }
9}
10
11macro_rules! impl_primitive {
12 ($ty:ty, $schema_type:expr) => {
13 impl GeminiSchema for $ty {
14 fn gemini_schema() -> Value {
15 json!({ "type": $schema_type })
16 }
17 }
18 };
19}
20
21impl_primitive!(String, "STRING");
22impl_primitive!(bool, "BOOLEAN");
23impl_primitive!(f32, "NUMBER");
24impl_primitive!(f64, "NUMBER");
25impl_primitive!(i8, "INTEGER");
26impl_primitive!(i16, "INTEGER");
27impl_primitive!(i32, "INTEGER");
28impl_primitive!(i64, "INTEGER");
29impl_primitive!(i128, "INTEGER");
30impl_primitive!(isize, "INTEGER");
31impl_primitive!(u8, "INTEGER");
32impl_primitive!(u16, "INTEGER");
33impl_primitive!(u32, "INTEGER");
34impl_primitive!(u64, "INTEGER");
35impl_primitive!(u128, "INTEGER");
36impl_primitive!(usize, "INTEGER");
37
38impl GeminiSchema for &str {
39 fn gemini_schema() -> Value {
40 json!({ "type": "STRING" })
41 }
42}
43
44impl<T: GeminiSchema> GeminiSchema for Vec<T> {
45 fn gemini_schema() -> Value {
46 json!({
47 "type": "ARRAY",
48 "items": T::gemini_schema()
49 })
50 }
51}
52
53impl<T: GeminiSchema> GeminiSchema for Option<T> {
54 fn gemini_schema() -> Value {
55 let mut schema = T::gemini_schema();
56 if let Some(obj) = schema.as_object_mut() {
57 obj.insert("nullable".to_string(), json!(true));
58 }
59 schema
60 }
61}