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
use json_decode::{BoxDecoder, DecodeError, Decoder}; use std::marker::PhantomData; pub trait Scalar: Sized { fn decode(value: &serde_json::Value) -> Result<Self, DecodeError>; } pub fn decoder<'a, S>() -> BoxDecoder<'a, S> where S: Scalar + 'a + Send + Sync, { Box::new(ScalarDecoder { phantom: PhantomData, }) } impl Scalar for i64 { fn decode(value: &serde_json::Value) -> Result<Self, DecodeError> { json_decode::integer().decode(value) } } impl Scalar for f64 { fn decode(value: &serde_json::Value) -> Result<Self, DecodeError> { json_decode::float().decode(value) } } impl Scalar for bool { fn decode(value: &serde_json::Value) -> Result<Self, DecodeError> { json_decode::boolean().decode(value) } } impl Scalar for String { fn decode(value: &serde_json::Value) -> Result<Self, DecodeError> { json_decode::string().decode(value) } } impl Scalar for serde_json::Value { fn decode(value: &serde_json::Value) -> Result<Self, DecodeError> { json_decode::json().decode(value) } } struct ScalarDecoder<S: Scalar> { phantom: PhantomData<S>, } impl<'a, S> Decoder<'a, S> for ScalarDecoder<S> where S: Scalar + Sized, { fn decode(&self, value: &serde_json::Value) -> Result<S, DecodeError> { S::decode(value) } }