avis_imgv/
callback.rs

1use std::path::PathBuf;
2
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4
5//Unsure about using the image path instead of its index to move it around
6//Currently collections are always ordered the same way but that could change in the
7//Future so in a way it's safer this way
8
9///Callbacks are functions which the user can
10///invoke under certain circumstances
11#[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}