You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
1.0 KiB
Rust
38 lines
1.0 KiB
Rust
3 years ago
|
use crate::constants::HYDRUS_TYPE_DICTIONARY;
|
||
|
use crate::hydrus_serializable::HydrusSerializable;
|
||
|
use serde::Deserialize;
|
||
|
use serde_json::Value;
|
||
|
|
||
|
#[derive(Clone, Debug, Deserialize)]
|
||
|
pub struct HydrusDictionary {
|
||
|
list_sim_sim: Vec<(Value, Value)>,
|
||
|
list_sim_ser: Vec<(Value, Value)>,
|
||
|
list_ser_sim: Vec<(Value, Value)>,
|
||
|
list_ser_ser: Vec<(Value, Value)>,
|
||
|
}
|
||
|
|
||
|
impl HydrusSerializable for HydrusDictionary {
|
||
|
fn type_id() -> u64 {
|
||
|
HYDRUS_TYPE_DICTIONARY
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl HydrusDictionary {
|
||
|
/// Returns the first value for a given key
|
||
|
pub fn get_one(&self, key: &Value) -> Option<&Value> {
|
||
|
self.get(key).into_iter().next()
|
||
|
}
|
||
|
|
||
|
/// Returns all values for a given key
|
||
|
pub fn get(&self, key: &Value) -> Vec<&Value> {
|
||
|
self.list_sim_sim
|
||
|
.iter()
|
||
|
.chain(self.list_sim_ser.iter())
|
||
|
.chain(self.list_ser_sim.iter())
|
||
|
.chain(self.list_ser_ser.iter())
|
||
|
.filter(|(k, _)| k == key)
|
||
|
.map(|(_, v)| v)
|
||
|
.collect()
|
||
|
}
|
||
|
}
|