1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
use crate::lib::{Value}; /// pub fn index_of(array: Value, value: Value, from_index: usize) -> isize { match value { Value::Null | Value::Bool(_) | Value::Number(_) | Value::String(_) => match array { Value::Null | Value::Bool(_) | Value::Number(_) | Value::String(_) | Value::Object(_) => -1, Value::Array(vec) => { for (i, item) in vec.iter().enumerate().skip(from_index) { if item == &value { return i as isize; } } -1 } }, Value::Array(_) | Value::Object(_) => -1, } } /// Description can be found in [lodash indexOf](https://lodash.com/docs/#indexOf) /// /// Examples: /// /// ```rust /// #[macro_use] extern crate serde_json_lodash; /// use serde_json::json; /// assert_eq!( /// index_of!(json!([1, 2, 1, 2]), json!(2)), /// 1 /// ); /// assert_eq!( /// index_of!(json!([1, 2, 1, 2]), json!(2), 2), /// 3 /// ); /// ``` /// /// More examples: /// /// ```rust /// # #[macro_use] extern crate serde_json_lodash; /// # use serde_json::json; /// assert_eq!(index_of!(), -1); /// assert_eq!(index_of!(json!(null)), -1); /// assert_eq!(index_of!(json!(true)), -1); /// assert_eq!(index_of!(json!(0)), -1); /// assert_eq!(index_of!(json!("")), -1); /// assert_eq!(index_of!(json!([])), -1); /// assert_eq!(index_of!(json!({})), -1); /// assert_eq!(index_of!(json!([null]), json!(null)), 0); /// assert_eq!(index_of!(json!([false]), json!(false)), 0); /// assert_eq!(index_of!(json!([0]), json!(0)), 0); /// assert_eq!(index_of!(json!([""]), json!("")), 0); /// assert_eq!(index_of!(json!([[]]), json!([])), -1); /// assert_eq!(index_of!(json!([[],1]), json!(1)), 1); /// assert_eq!(index_of!(json!([{}]), json!({})), -1); /// assert_eq!(index_of!(json!([{"a":1}]), json!({"a":1})), -1); /// assert_eq!(index_of!(json!([{"a":1},1]), json!(1)), 1); /// assert_eq!(index_of!(json!([{"a":1},1,2,1,2]), json!(2)), 2); /// assert_eq!(index_of!(json!([{"a":1},1,2,1,2]), json!(2), 3), 4); /// assert_eq!(index_of!(json!([{"a":1},1,2,1,2]), json!(2), 6), -1); /// ``` #[macro_export] macro_rules! index_of { () => { -1 }; ($a:expr $(,)*) => { -1 }; ($a:expr, $b:expr $(,)*) => {{ $crate::index_of($a, $b, 0) }}; ($a:expr, $b:expr, $c:expr $(,)*) => { $crate::index_of($a, $b, $c) }; ($a:expr, $b:expr, $c:expr, $($rest:tt)*) => { $crate::index_of($a, $b, $c) }; }