(
values: &'a [Value],
mut element_type: &'a Value,
)
| 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 | |
| 263 | fn 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 | } |
no test coverage detected