|
| 1 | +use crate::builder::plan::AnalyzedFieldReference; |
| 2 | +use crate::builder::plan::AnalyzedLocalFieldReference; |
| 3 | +use std::collections::BTreeMap; |
| 4 | +use std::sync::Arc; |
| 5 | + |
1 | 6 | pub use super::factory_bases::*; |
2 | 7 | pub use super::interface::*; |
3 | 8 | pub use crate::base::schema::*; |
| 9 | +pub use crate::base::spec::*; |
4 | 10 | pub use crate::base::value::*; |
5 | 11 | pub use anyhow::Result; |
6 | 12 | pub use axum::async_trait; |
@@ -46,3 +52,75 @@ macro_rules! fields_value { |
46 | 52 | $crate::base::value::FieldValues { fields: std::vec![ $(($field).into()),+ ] } |
47 | 53 | }; |
48 | 54 | } |
| 55 | + |
| 56 | +pub struct SchemaBuilderFieldRef(AnalyzedLocalFieldReference); |
| 57 | + |
| 58 | +impl SchemaBuilderFieldRef { |
| 59 | + pub fn to_field_ref(&self) -> AnalyzedFieldReference { |
| 60 | + AnalyzedFieldReference { |
| 61 | + local: self.0.clone(), |
| 62 | + scope_up_level: 0, |
| 63 | + } |
| 64 | + } |
| 65 | +} |
| 66 | +pub struct StructSchemaBuilder<'a> { |
| 67 | + base_fields_idx: Vec<u32>, |
| 68 | + target: &'a mut StructSchema, |
| 69 | +} |
| 70 | + |
| 71 | +impl<'a> StructSchemaBuilder<'a> { |
| 72 | + pub fn new(target: &'a mut StructSchema) -> Self { |
| 73 | + Self { |
| 74 | + base_fields_idx: Vec::new(), |
| 75 | + target, |
| 76 | + } |
| 77 | + } |
| 78 | + |
| 79 | + pub fn set_description(&mut self, description: impl Into<Arc<str>>) { |
| 80 | + self.target.description = Some(description.into()); |
| 81 | + } |
| 82 | + |
| 83 | + pub fn add_field(&mut self, field_schema: FieldSchema) -> SchemaBuilderFieldRef { |
| 84 | + let current_idx = self.target.fields.len() as u32; |
| 85 | + Arc::make_mut(&mut self.target.fields).push(field_schema); |
| 86 | + let mut fields_idx = self.base_fields_idx.clone(); |
| 87 | + fields_idx.push(current_idx); |
| 88 | + SchemaBuilderFieldRef(AnalyzedLocalFieldReference { fields_idx }) |
| 89 | + } |
| 90 | + |
| 91 | + pub fn add_struct_field<'b>( |
| 92 | + &'b mut self, |
| 93 | + name: impl Into<FieldName>, |
| 94 | + nullable: bool, |
| 95 | + attrs: Arc<BTreeMap<String, serde_json::Value>>, |
| 96 | + ) -> (StructSchemaBuilder<'b>, SchemaBuilderFieldRef) { |
| 97 | + let field_schema = FieldSchema::new( |
| 98 | + name.into(), |
| 99 | + EnrichedValueType { |
| 100 | + typ: ValueType::Struct(StructSchema { |
| 101 | + fields: Arc::new(Vec::new()), |
| 102 | + description: None, |
| 103 | + }), |
| 104 | + nullable, |
| 105 | + attrs, |
| 106 | + }, |
| 107 | + ); |
| 108 | + let local_ref = self.add_field(field_schema); |
| 109 | + let struct_schema = match &mut Arc::make_mut(&mut self.target.fields) |
| 110 | + .last_mut() |
| 111 | + .unwrap() |
| 112 | + .value_type |
| 113 | + .typ |
| 114 | + { |
| 115 | + ValueType::Struct(s) => s, |
| 116 | + _ => unreachable!(), |
| 117 | + }; |
| 118 | + ( |
| 119 | + StructSchemaBuilder { |
| 120 | + base_fields_idx: local_ref.0.fields_idx.clone(), |
| 121 | + target: struct_schema, |
| 122 | + }, |
| 123 | + local_ref, |
| 124 | + ) |
| 125 | + } |
| 126 | +} |
0 commit comments