Skip to main content

gemini_client_api/gemini/utils/
macros.rs

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