1use crate::types::{H256, U256};
2use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer};
3use serde_json::{self, Value};
4
5#[derive(Debug, PartialEq, Eq)]
7pub struct Work {
8 pub pow_hash: H256,
10 pub seed_hash: H256,
12 pub target: H256,
14 pub number: Option<u64>,
16}
17
18impl<'a> Deserialize<'a> for Work {
19 fn deserialize<D>(deserializer: D) -> Result<Work, D::Error>
20 where
21 D: Deserializer<'a>,
22 {
23 let v: Value = Deserialize::deserialize(deserializer)?;
24
25 let (pow_hash, seed_hash, target, number) = serde_json::from_value::<(H256, H256, H256, u64)>(v.clone())
26 .map(|(pow_hash, seed_hash, target, number)| (pow_hash, seed_hash, target, Some(number)))
27 .or_else(|_| {
28 serde_json::from_value::<(H256, H256, H256)>(v)
29 .map(|(pow_hash, seed_hash, target)| (pow_hash, seed_hash, target, None))
30 })
31 .map_err(|e| D::Error::custom(format!("Cannot deserialize Work: {:?}", e)))?;
32
33 Ok(Work {
34 pow_hash,
35 seed_hash,
36 target,
37 number,
38 })
39 }
40}
41
42impl Serialize for Work {
43 fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
44 where
45 S: Serializer,
46 {
47 match self.number.as_ref() {
48 Some(num) => (&self.pow_hash, &self.seed_hash, &self.target, U256::from(*num)).serialize(s),
49 None => (&self.pow_hash, &self.seed_hash, &self.target).serialize(s),
50 }
51 }
52}