...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package model
15
16 import (
17 "encoding/json"
18 "fmt"
19 "math"
20 "strconv"
21 )
22
23
24
25
26
27
28 var ZeroSamplePair = SamplePair{Timestamp: Earliest}
29
30
31
32 type SampleValue float64
33
34
35 func (v SampleValue) MarshalJSON() ([]byte, error) {
36 return json.Marshal(v.String())
37 }
38
39
40 func (v *SampleValue) UnmarshalJSON(b []byte) error {
41 if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
42 return fmt.Errorf("sample value must be a quoted string")
43 }
44 f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64)
45 if err != nil {
46 return err
47 }
48 *v = SampleValue(f)
49 return nil
50 }
51
52
53
54
55 func (v SampleValue) Equal(o SampleValue) bool {
56 if v == o {
57 return true
58 }
59 return math.IsNaN(float64(v)) && math.IsNaN(float64(o))
60 }
61
62 func (v SampleValue) String() string {
63 return strconv.FormatFloat(float64(v), 'f', -1, 64)
64 }
65
66
67 type SamplePair struct {
68 Timestamp Time
69 Value SampleValue
70 }
71
72 func (s SamplePair) MarshalJSON() ([]byte, error) {
73 t, err := json.Marshal(s.Timestamp)
74 if err != nil {
75 return nil, err
76 }
77 v, err := json.Marshal(s.Value)
78 if err != nil {
79 return nil, err
80 }
81 return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil
82 }
83
84
85 func (s *SamplePair) UnmarshalJSON(b []byte) error {
86 v := [...]json.Unmarshaler{&s.Timestamp, &s.Value}
87 return json.Unmarshal(b, &v)
88 }
89
90
91
92 func (s *SamplePair) Equal(o *SamplePair) bool {
93 return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp))
94 }
95
96 func (s SamplePair) String() string {
97 return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp)
98 }
99
View as plain text