1use std::path::PathBuf;
2
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4
5#[derive(Clone, Debug)]
12pub enum Callback {
13 ReloadAll,
14 Reload(Option<PathBuf>),
15 Pop(Option<PathBuf>),
16 NoAction,
17}
18
19impl Callback {
20 pub fn from_callback(callback: Callback, path: Option<PathBuf>) -> Callback {
21 match callback {
22 Callback::ReloadAll => Self::ReloadAll,
23 Callback::Reload(_) => Self::Reload(path),
24 Callback::Pop(_) => Self::Pop(path),
25 Callback::NoAction => Self::NoAction,
26 }
27 }
28}
29
30impl<'de> Deserialize<'de> for Callback {
31 fn deserialize<D>(deserializer: D) -> Result<Callback, D::Error>
32 where
33 D: Deserializer<'de>,
34 {
35 let s = String::deserialize(deserializer)?;
36
37 Ok(match s.as_str() {
38 "ReloadAll" => Callback::ReloadAll,
39 "Reload" => Callback::Reload(None),
40 "Pop" => Callback::Pop(None),
41 "" => Callback::NoAction,
42 &_ => Callback::NoAction,
43 })
44 }
45}
46
47impl Serialize for Callback {
48 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
49 where
50 S: Serializer,
51 {
52 serializer.serialize_str(match self {
53 Callback::NoAction => "",
54 Callback::ReloadAll => "ReloadAll",
55 Callback::Pop(_) => "Pop",
56 Callback::Reload(_) => "Reload",
57 })
58 }
59}