vector_config/external/
indexmap.rs1use std::cell::RefCell;
2
3use indexmap::{IndexMap, IndexSet};
4use serde_json::Value;
5
6use crate::{
7 schema::{
8 assert_string_schema_for_map, generate_map_schema, generate_set_schema, SchemaGenerator,
9 SchemaObject,
10 },
11 str::ConfigurableString,
12 Configurable, GenerateError, Metadata, ToValue,
13};
14
15impl<K, V> Configurable for IndexMap<K, V>
16where
17 K: ConfigurableString + ToValue + std::hash::Hash + Eq + 'static,
18 V: Configurable + ToValue + 'static,
19{
20 fn is_optional() -> bool {
21 true
24 }
25
26 fn metadata() -> Metadata {
27 Metadata::with_transparent(true)
28 }
29
30 fn validate_metadata(metadata: &Metadata) -> Result<(), GenerateError> {
31 let converted = metadata.convert();
32 V::validate_metadata(&converted)
33 }
34
35 fn generate_schema(gen: &RefCell<SchemaGenerator>) -> Result<SchemaObject, GenerateError> {
36 assert_string_schema_for_map(
38 &K::as_configurable_ref(),
39 gen,
40 std::any::type_name::<Self>(),
41 )?;
42
43 generate_map_schema(&V::as_configurable_ref(), gen)
44 }
45}
46
47impl<K, V> ToValue for IndexMap<K, V>
48where
49 K: ToString,
50 V: ToValue,
51{
52 fn to_value(&self) -> Value {
53 Value::Object(
54 self.iter()
55 .map(|(k, v)| (k.to_string(), v.to_value()))
56 .collect(),
57 )
58 }
59}
60
61impl<V> Configurable for IndexSet<V>
62where
63 V: Configurable + ToValue + std::hash::Hash + Eq + 'static,
64{
65 fn metadata() -> Metadata {
66 Metadata::with_transparent(true)
67 }
68
69 fn validate_metadata(metadata: &Metadata) -> Result<(), GenerateError> {
70 let converted = metadata.convert();
71 V::validate_metadata(&converted)
72 }
73
74 fn generate_schema(gen: &RefCell<SchemaGenerator>) -> Result<SchemaObject, GenerateError> {
75 generate_set_schema(&V::as_configurable_ref(), gen)
76 }
77}
78
79impl<V: ToValue> ToValue for IndexSet<V> {
80 fn to_value(&self) -> Value {
81 Value::Array(self.iter().map(ToValue::to_value).collect())
82 }
83}