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 85 86 87 88 89 90 91 92 93 94
use crate::ApiRequest; use serde::de::Deserializer; use serde::Deserialize; use serde::Serialize; use std::collections::HashMap; use super::Item; #[derive(Serialize)] pub struct Lookup { pub names: Vec<String>, } fn data_or_no_data<'de, D>(deserializer: D) -> Result<HashMap<String, Item>, D::Error> where D: Deserializer<'de>, { #[derive(Deserialize)] #[serde(untagged)] enum DorNd { Data(HashMap<String, Item>), NoData([(); 0]), } let d = DorNd::deserialize(deserializer)?; let v = match d { DorNd::Data(v) => v, DorNd::NoData(_) => HashMap::new(), }; Ok(v) } #[derive(Deserialize, Debug)] #[serde(transparent)] pub struct LookupResult(#[serde(deserialize_with = "data_or_no_data")] HashMap<String, Item>); impl ApiRequest for Lookup { type Reply = LookupResult; const ROUTE: &'static str = "api/phid.lookup"; } #[cfg(test)] mod test { use super::*; use phabricator_mock::PhabMockServer; #[tokio::test] async fn simple() { let m = PhabMockServer::start().await; let user = m.new_user("user", "Test User"); m.new_simple_task(100, &user); let client = crate::Client::new(m.uri(), m.token().to_string()); let l = Lookup { names: vec!["T100".to_owned()], }; let r = client.request(&l).await.unwrap(); assert!(r.0.contains_key("T100")); } #[tokio::test] async fn multiple() { let m = PhabMockServer::start().await; let user = m.new_user("user", "Test User"); m.new_simple_task(100, &user); m.new_simple_task(200, &user); let client = crate::Client::new(m.uri(), m.token().to_string()); let l = Lookup { names: vec!["T100".to_owned(), "T200".to_owned()], }; let r = client.request(&l).await.unwrap(); for n in l.names { assert!(r.0.contains_key(&n), "missing task {}", &n); } } #[tokio::test] async fn no_result() { let m = PhabMockServer::start().await; let client = crate::Client::new(m.uri(), m.token().to_string()); let l = Lookup { names: vec!["T100".to_owned(), "T200".to_owned()], }; let r = client.request(&l).await.unwrap(); assert_eq!(r.0.len(), 0); } }