MCPcopy Create free account
hub / github.com/TankHQ/tank / flatten_array

Function flatten_array

tank-postgres/src/util.rs:231–265  ·  view source on GitHub ↗
(
    values: &'a [Value],
    mut element_type: &'a Value,
)

Source from the content-addressed store, hash-verified

229 mut element_type: &'a Value,
230) -> (Vec<&'a Value>, Vec<ArrayDimension>, Type) {
231 let mut dimensions = Vec::new();
232 let mut current_level = values;
233 let mut total_capacity = 1;
234 loop {
235 let len = current_level.len();
236 dimensions.push(ArrayDimension {
237 len: len as i32,
238 lower_bound: 1,
239 });
240 total_capacity *= len;
241 if len == 0 {
242 total_capacity = 0;
243 break;
244 }
245 match current_level.first() {
246 Some(Value::Array(Some(inner), ..)) => current_level = inner,
247 Some(Value::List(Some(inner), ..)) => current_level = inner.as_slice(),
248 _ => break,
249 }
250 }
251 loop {
252 match element_type {
253 Value::Array(.., element, _) | Value::List(.., element) => element_type = element,
254 _ => break,
255 }
256 }
257 let pg_type = value_to_postgres_type(element_type);
258 let mut collector = Vec::with_capacity(total_capacity);
259 flatten_recursive(values, &mut collector);
260 (collector, dimensions, pg_type)
261}
262
263fn flatten_recursive<'a>(values: &'a [Value], collector: &mut Vec<&'a Value>) {
264 for value in values {
265 match value {
266 Value::Array(Some(inner), ..) => {
267 flatten_recursive(inner, collector);
268 }

Callers 1

to_sqlMethod · 0.85

Calls 4

value_to_postgres_typeFunction · 0.85
flatten_recursiveFunction · 0.85
pushMethod · 0.80
lenMethod · 0.45

Tested by

no test coverage detected