1use super::float_is::Is;
2use serde::{Deserialize, Serialize};
3
4#[derive(Serialize, Deserialize, Debug)]
5#[serde(tag = "type", content = "value", rename_all = "kebab-case")]
6pub enum Value {
7 Boolean(bool),
8 Constant(u16),
9 Float32(f32),
10 Float64(f64),
11 Null,
12 Register(u8),
13 Sint32(i32),
14 String(String),
15 Undefined,
16}
17
18impl ::std::cmp::PartialEq for Value {
19 fn eq(&self, other: &Self) -> bool {
20 match (self, other) {
21 (&Value::Boolean(left), &Value::Boolean(right)) => left == right,
22 (&Value::Constant(left), &Value::Constant(right)) => left == right,
23 (&Value::Float32(left), &Value::Float32(right)) => left.is(&right),
24 (&Value::Float64(left), &Value::Float64(right)) => left.is(&right),
25 (&Value::Null, &Value::Null) => true,
26 (&Value::Register(left), &Value::Register(right)) => left == right,
27 (&Value::Sint32(left), &Value::Sint32(right)) => left == right,
28 (&Value::String(ref left), &Value::String(ref right)) => left == right,
29 (&Value::Undefined, &Value::Undefined) => true,
30 _ => false,
31 }
32 }
33
34 fn ne(&self, other: &Self) -> bool {
35 !self.eq(other)
36 }
37}
38
39impl ::std::cmp::Eq for Value {}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44 use ::test_generator::test_resources;
45
46 #[test]
47 fn test_eq() {
48 assert_eq!(Value::Boolean(false), Value::Boolean(false));
49 assert_eq!(Value::Constant(0), Value::Constant(0));
50 assert_eq!(Value::Float32(0.0), Value::Float32(0.0));
51 assert_eq!(Value::Float32(::std::f32::NAN), Value::Float32(::std::f32::NAN));
52 assert_eq!(Value::Float64(0.0), Value::Float64(0.0));
53 assert_eq!(Value::Float64(::std::f64::NAN), Value::Float64(::std::f64::NAN));
54 assert_eq!(Value::Null, Value::Null);
55 assert_eq!(Value::Register(0), Value::Register(0));
56 assert_eq!(Value::Sint32(0), Value::Sint32(0));
57 assert_eq!(Value::String(String::new()), Value::String(String::new()));
58 assert_eq!(Value::Undefined, Value::Undefined);
59 }
60
61 #[test_resources("../tests/*.json")]
62 fn test_parse_json(path: &str) {
63 let file = ::std::fs::File::open(path).unwrap();
64 let reader = ::std::io::BufReader::new(file);
65 serde_json::from_reader::<_, Value>(reader).unwrap();
67 }
68}