use std::mem;
use crate::lib::{json, Value};
pub fn fill(mut array: Value, value: Value, start: usize, end: usize) -> Value {
let vec = match array {
Value::Null | Value::Bool(_) | Value::Number(_) | Value::String(_) | Value::Object(_) => {
return json!([])
}
Value::Array(ref mut vec) => {
let real_end = {
if end > vec.len() {
vec.len()
} else {
end
}
};
for item in vec.iter_mut().take(real_end).skip(start) {
let _ = mem::replace(item, value.clone());
}
vec
}
};
*array.as_array_mut().unwrap() = vec.to_vec();
array
}
#[macro_export]
macro_rules! fill {
() => {
json!([])
};
($a:expr $(,)*) => {
$crate::fill($a, json!(null), 0, $a.as_array().unwrap_or(&vec![]).len())
};
($a:expr, $b:expr $(,)*) => {
$crate::fill($a, $b, 0, $a.as_array().unwrap_or(&vec![]).len())
};
($a:expr, $b:expr, $c:expr $(,)*) => {
$crate::fill($a, $b, $c, $a.as_array().unwrap_or(&vec![]).len())
};
($a:expr, $b:expr, $c:expr, $d:expr $(,)*) => {
$crate::fill($a, $b, $c, $d)
};
($a:expr, $b:expr, $c:expr, $d:expr, $($rest:tt)*) => {
$crate::fill($a, $b, $c, $d)
};
}