extern crate serde;
use self::serde::{Deserialize, Deserializer};
use self::serde::de::{Error, Unexpected};
extern crate serde_json;
use self::serde_json::Value;
use systemhooks::SystemHook;
use webhooks::WebHook;
#[derive(Debug, Clone)]
pub enum GitlabHook {
System(SystemHook),
Web(WebHook),
}
impl Deserialize for GitlabHook {
fn deserialize<D: Deserializer>(deserializer: D) -> Result<Self, D::Error> {
let val = <Value as Deserialize>::deserialize(deserializer)?;
let hook_res = if val.pointer("/object_kind").is_some() {
serde_json::from_value(val).map(GitlabHook::Web)
} else if val.pointer("/event_name").is_some() {
serde_json::from_value(val).map(GitlabHook::System)
} else {
return Err(D::Error::missing_field("either object_kind or event_name"));
};
hook_res.map_err(|err| {
D::Error::invalid_value(Unexpected::Other("gitlab hook"),
&format!("{:?}", err).as_str())
})
}
}