slow_blink 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/ext/slow_blink/ext_compact_encoder/compact_encoder.c +258 -0
  3. data/ext/slow_blink/ext_compact_encoder/compact_encoder.h +92 -0
  4. data/ext/slow_blink/ext_compact_encoder/ext_compact_encoder.c +555 -0
  5. data/ext/slow_blink/ext_compact_encoder/extconf.rb +4 -0
  6. data/ext/slow_blink/ext_schema_parser/lexer.c +59 -59
  7. data/ext/slow_blink/ext_schema_parser/lexer.h +2 -2
  8. data/ext/slow_blink/ext_schema_parser/parser.c +380 -367
  9. data/ext/slow_blink/ext_schema_parser/parser.h +1 -1
  10. data/lib/slow_blink/annotatable.rb +1 -1
  11. data/lib/slow_blink/annotation.rb +5 -5
  12. data/lib/slow_blink/binary.rb +26 -0
  13. data/lib/slow_blink/boolean.rb +26 -0
  14. data/lib/slow_blink/compact_encoder.rb +45 -71
  15. data/lib/slow_blink/date.rb +25 -0
  16. data/lib/slow_blink/decimal.rb +26 -0
  17. data/lib/slow_blink/definition.rb +19 -10
  18. data/lib/slow_blink/enumeration.rb +14 -36
  19. data/lib/slow_blink/error.rb +19 -0
  20. data/lib/slow_blink/field.rb +3 -16
  21. data/lib/slow_blink/fixed.rb +26 -0
  22. data/lib/slow_blink/floating_point.rb +27 -0
  23. data/lib/slow_blink/group.rb +30 -43
  24. data/lib/slow_blink/incremental_annotation.rb +75 -21
  25. data/lib/slow_blink/integer.rb +65 -0
  26. data/lib/slow_blink/message/binary.rb +87 -0
  27. data/lib/slow_blink/message/boolean.rb +68 -0
  28. data/lib/slow_blink/message/date.rb +33 -0
  29. data/lib/slow_blink/message/decimal.rb +25 -0
  30. data/lib/slow_blink/message/enumeration.rb +69 -0
  31. data/lib/slow_blink/message/field.rb +73 -0
  32. data/lib/slow_blink/message/fixed.rb +84 -0
  33. data/lib/slow_blink/message/floating_point.rb +68 -0
  34. data/lib/slow_blink/message/group.rb +260 -0
  35. data/lib/slow_blink/message/integer.rb +217 -0
  36. data/lib/slow_blink/message/model.rb +202 -0
  37. data/lib/slow_blink/message/sequence.rb +85 -0
  38. data/lib/slow_blink/message/string.rb +95 -0
  39. data/lib/slow_blink/message/time.rb +78 -0
  40. data/lib/slow_blink/message/time_of_day.rb +132 -0
  41. data/lib/slow_blink/name_with_id.rb +2 -1
  42. data/lib/slow_blink/namespace.rb +140 -0
  43. data/lib/slow_blink/object.rb +29 -0
  44. data/lib/slow_blink/ref.rb +93 -0
  45. data/lib/slow_blink/schema.rb +94 -68
  46. data/lib/slow_blink/{component_reference.rb → schema_buffer.rb} +11 -22
  47. data/lib/slow_blink/sequence.rb +58 -0
  48. data/lib/slow_blink/string.rb +40 -0
  49. data/lib/slow_blink/sym.rb +4 -0
  50. data/lib/slow_blink/time.rb +30 -0
  51. data/lib/slow_blink/time_of_day.rb +30 -0
  52. data/lib/slow_blink/type.rb +7 -402
  53. data/lib/slow_blink/version.rb +1 -1
  54. data/lib/slow_blink.rb +1 -0
  55. data/rakefile +14 -3
  56. data/test/{integration/capture_stderr.rb → capture_stderr.rb} +0 -0
  57. data/test/tc_compact_encoder.rb +341 -0
  58. data/test/tc_field.rb +53 -0
  59. data/test/tc_group.rb +122 -0
  60. data/test/tc_incr_annote.rb +27 -0
  61. data/test/{integration/tc_inputs.rb → tc_inputs.rb} +7 -11
  62. data/test/tc_model.rb +65 -0
  63. data/test/tc_model_encode.rb +63 -0
  64. data/test/tc_namespace.rb +8 -0
  65. data/test/tc_types.rb +198 -0
  66. metadata +58 -11
  67. data/ext/slow_blink/ext_schema_parser/parser.l +0 -139
  68. data/ext/slow_blink/ext_schema_parser/parser.y +0 -932
  69. data/lib/slow_blink/message.rb +0 -43
@@ -22,17 +22,17 @@ module SlowBlink
22
22
  # Blink Specification 7.3
23
23
  class IncrementalAnnotation
24
24
 
25
- attr_reader :ref
25
+ attr_reader :componentReference
26
26
  attr_reader :annotes
27
27
  attr_reader :location
28
28
 
29
29
  # @private
30
30
  #
31
- # @param ref [SchemaRef, DefinitionRef, DefinitionTypeRef, FieldRef, FieldTypeRef] annotation target
31
+ # @param componentReference [SchemaRef, DefinitionRef, DefinitionTypeRef, FieldRef, FieldTypeRef] annotation target
32
32
  # @param annotations [Array<Integer,Annotation>]
33
33
  # @param location [String]
34
- def initialize(ref, annotes, location)
35
- @ref = ref
34
+ def initialize(componentReference, annotes, location)
35
+ @componentReference = componentReference
36
36
  @annotes = annotes
37
37
  @location = location
38
38
  @schema = nil
@@ -42,50 +42,104 @@ module SlowBlink
42
42
  #
43
43
  # Apply annotes to targets
44
44
  #
45
- # @macro common_link
46
- def link(schema, stack=[])
47
- if @schema != schema
48
- @schema = nil
49
- case @ref.class
50
- when SchemaRef
51
- schema.annote(@annotes)
45
+ # @param schema [Schema]
46
+ # @param namespace [Namespace] the namespace this annotation was defined in
47
+ #
48
+ def apply(schema, namespace)
49
+ if @schema.nil?
50
+ case @componentReference.class
51
+ when SchemaRef # this actually refers to the Namespace
52
+ namespace.annote(@annotes)
52
53
  @schema = schema
53
54
  when DefinitionRef
54
- object = schema.symbol(ref.qName)
55
+ object = schema.resolve(@componentReference.namespace, @componentReference.name)
55
56
  if object
56
- object.nameWithID.annote(@annotes)
57
+ object.annote(@annotes)
57
58
  @schema = schema
58
59
  end
59
60
  when DefinitionTypeRef
60
- object = schema.symbol(ref.qName)
61
+ object = schema.resolve(@componentReference.namespace, @componentReference.name)
61
62
  if object
62
- object.enumOrType.annote(@annotes)
63
+ object.type.annote(@annotes)
63
64
  @schema = schema
64
65
  end
65
66
  when FieldRef
66
- object = schema.symbol(ref.qName)
67
+ object = schema.resolve(@componentReference.namespace, @componentReference.name)
67
68
  if object
68
- field = object.field(ref.name)
69
+ field = object.field(@componentReference.subname)
69
70
  if field
70
- field.nameWithID.annote(@annotes)
71
+ field.annote(@annotes)
71
72
  @schema = schema
72
73
  end
73
74
  end
74
75
  when FieldTypeRef
75
- object = schema.symbol(ref.qName)
76
+ object = schema.resolve(@componentReference.namespace, @componentReference.name)
76
77
  if object
77
- field = object.field(ref.name)
78
+ field = object.field(@componentReference.subname)
78
79
  if field
79
80
  field.type.annote(@annotes)
80
81
  @schema = schema
81
82
  end
82
83
  end
83
84
  else
84
- raise "unknown component reference".freeze
85
+ raise "unknown component reference #{@componentReference.class}".freeze
85
86
  end
86
87
  end
87
88
  @schema
88
89
  end
89
90
 
90
91
  end
92
+
93
+ # SCHEMA
94
+ class SchemaRef
95
+ def self.===(other)
96
+ self == other
97
+ end
98
+ end
99
+
100
+ # qName
101
+ class DefinitionRef < SchemaRef
102
+ attr_reader :namespace
103
+ attr_reader :name
104
+ attr_reader :qname
105
+ # @param qName [String] name of the definition to annotate
106
+ def initialize(qname)
107
+ @qname = qname
108
+ if qname.split(":").size == 1
109
+ @namespace = nil
110
+ @name = qname
111
+ else
112
+ @namespace = qname.split(":").first
113
+ @name = qName.split(":").last
114
+ end
115
+ end
116
+ end
117
+
118
+ # qName.TYPE
119
+ class DefinitionTypeRef < DefinitionRef
120
+ end
121
+
122
+ # qName.name
123
+ class FieldRef < SchemaRef
124
+ attr_reader :namespace
125
+ attr_reader :name
126
+ attr_reader :qname
127
+ attr_reader :subname
128
+ def initialize(qname, name)
129
+ @qname = qname
130
+ if qname.split(":").size == 1
131
+ @namespace = nil
132
+ @name = qname
133
+ else
134
+ @namespace = qname.split(":").first
135
+ @name = qName.split(":").last
136
+ end
137
+ @subname = name
138
+ end
139
+ end
140
+
141
+ # qName.name.TYPE
142
+ class FieldTypeRef < FieldRef
143
+ end
144
+
91
145
  end
@@ -0,0 +1,65 @@
1
+ # Copyright (c) 2016 Cameron Harper
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ # this software and associated documentation files (the "Software"), to deal in
5
+ # the Software without restriction, including without limitation the rights to
6
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
+ # the Software, and to permit persons to whom the Software is furnished to do so,
8
+ # subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all
11
+ # copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
+
20
+ module SlowBlink
21
+
22
+ class INTEGER < Type
23
+ end
24
+
25
+ # Blink Specification 3.1
26
+ class I8 < INTEGER
27
+ RANGE = Range.new(-128, 127)
28
+ end
29
+
30
+ # Blink Specification 3.1
31
+ class I16 < INTEGER
32
+ RANGE = Range.new(-32768, 32767)
33
+ end
34
+
35
+ # Blink Specification 3.1
36
+ class I32 < INTEGER
37
+ RANGE = Range.new(-2147483648, 2147483647)
38
+ end
39
+
40
+ # Blink Specification 3.1
41
+ class I64 < INTEGER
42
+ RANGE = Range.new(-9223372036854775808, 9223372036854775807)
43
+ end
44
+
45
+ # Blink Specification 3.1
46
+ class U8 < INTEGER
47
+ RANGE = Range.new(0, 0xff)
48
+ end
49
+
50
+ # Blink Specification 3.1
51
+ class U16 < INTEGER
52
+ RANGE = Range.new(0, 0xffff)
53
+ end
54
+
55
+ # Blink Specification 3.1
56
+ class U32 < INTEGER
57
+ RANGE = Range.new(0, 0xffffffff)
58
+ end
59
+
60
+ # Blink Specification 3.1
61
+ class U64 < INTEGER
62
+ RANGE = Range.new(0, 0xffffffffffffffff)
63
+ end
64
+
65
+ end
@@ -0,0 +1,87 @@
1
+ # Copyright (c) 2016 Cameron Harper
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ # this software and associated documentation files (the "Software"), to deal in
5
+ # the Software without restriction, including without limitation the rights to
6
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
+ # the Software, and to permit persons to whom the Software is furnished to do so,
8
+ # subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all
11
+ # copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
+
20
+ module SlowBlink::Message
21
+
22
+ module BINARY
23
+
24
+ module CLASS
25
+
26
+ def opt?
27
+ @opt
28
+ end
29
+
30
+ def from_compact!(input)
31
+ value = input.getBinary!
32
+ if value
33
+ if !@size or value.size <= @size
34
+ self.new(value)
35
+ else
36
+ raise Error.new "W8: Binary value exceeds maximum size"
37
+ end
38
+ elsif @opt
39
+ self.new(nil)
40
+ else
41
+ raise Error.new "W5: Value cannot be null"
42
+ end
43
+ end
44
+
45
+ def size
46
+ @type.size
47
+ end
48
+
49
+ end
50
+
51
+ module INSTANCE
52
+
53
+ def set(value)
54
+ if value
55
+ if value.kind_of? String
56
+ if !self.class.size or value.size <= self.class.size
57
+ @value = value
58
+ else
59
+ raise Error.new "string cannot be larger than #{self.class.size} bytes"
60
+ end
61
+ else
62
+ raise Error.new "expecting a string type"
63
+ end
64
+ elsif self.class.opt?
65
+ @value = nil
66
+ else
67
+ raise Error.new "string cannot be null"
68
+ end
69
+ end
70
+
71
+ def get
72
+ @value
73
+ end
74
+
75
+ def initialize(value)
76
+ set(value)
77
+ end
78
+
79
+ def to_compact(out)
80
+ out.putBinary(@value)
81
+ end
82
+
83
+ end
84
+
85
+ end
86
+
87
+ end
@@ -0,0 +1,68 @@
1
+ # Copyright (c) 2016 Cameron Harper
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ # this software and associated documentation files (the "Software"), to deal in
5
+ # the Software without restriction, including without limitation the rights to
6
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
+ # the Software, and to permit persons to whom the Software is furnished to do so,
8
+ # subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all
11
+ # copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
+
20
+ module SlowBlink::Message
21
+
22
+ module BOOLEAN
23
+
24
+ module CLASS
25
+
26
+ def from_compact!(input)
27
+ self.new(input.getBool!)
28
+ end
29
+
30
+ end
31
+
32
+ module INSTANCE
33
+
34
+ def set(value)
35
+ if value
36
+ if value.kind_of? TrueClass or value.kind_of? FalseClass
37
+ @value = value
38
+ else
39
+ raise "expecting true/false"
40
+ end
41
+ elsif self.class.opt?
42
+ @value = nil
43
+ else
44
+ raise Error.new "value unacceptable"
45
+ end
46
+ end
47
+
48
+ def get
49
+ @value
50
+ end
51
+
52
+ def initialize(value)
53
+ if value
54
+ set(value)
55
+ else
56
+ @value = nil
57
+ end
58
+ end
59
+
60
+ def to_compact(out)
61
+ out.putBool(@value)
62
+ end
63
+
64
+ end
65
+
66
+ end
67
+
68
+ end
@@ -0,0 +1,33 @@
1
+ # Copyright (c) 2016 Cameron Harper
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ # this software and associated documentation files (the "Software"), to deal in
5
+ # the Software without restriction, including without limitation the rights to
6
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
+ # the Software, and to permit persons to whom the Software is furnished to do so,
8
+ # subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all
11
+ # copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
+
20
+ module SlowBlink::Message
21
+
22
+ module DATE
23
+
24
+ module CLASS
25
+ end
26
+
27
+ module INSTANCE
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2016 Cameron Harper
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ # this software and associated documentation files (the "Software"), to deal in
5
+ # the Software without restriction, including without limitation the rights to
6
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
+ # the Software, and to permit persons to whom the Software is furnished to do so,
8
+ # subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all
11
+ # copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
+
20
+ module SlowBlink::Message
21
+
22
+ module DECIMAL
23
+ end
24
+
25
+ end
@@ -0,0 +1,69 @@
1
+ # Copyright (c) 2016 Cameron Harper
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ # this software and associated documentation files (the "Software"), to deal in
5
+ # the Software without restriction, including without limitation the rights to
6
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
+ # the Software, and to permit persons to whom the Software is furnished to do so,
8
+ # subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all
11
+ # copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
+
20
+ module SlowBlink::Message
21
+
22
+ module ENUMERATION
23
+
24
+ module CLASS
25
+
26
+ def from_compact!(input)
27
+ self.new(input.getU32!)
28
+ end
29
+
30
+ end
31
+
32
+ module INSTANCE
33
+
34
+ # @param v [String]
35
+ def set(value)
36
+ if value
37
+ if self.symbols[value]
38
+ @value = self.class.symbols[value]
39
+ else
40
+ raise Error.new "symbol '#{value}' not defined in enumeration"
41
+ end
42
+ elsif self.class.opt?
43
+ @value = nil
44
+ else
45
+ raise Error.new "field may not be null"
46
+ end
47
+ end
48
+
49
+ def get
50
+ @value
51
+ end
52
+
53
+ def initialize(value)
54
+ if value
55
+ set(value)
56
+ else
57
+ @value = nil
58
+ end
59
+ end
60
+
61
+ def to_compact(out)
62
+ out.putU32(@value ? self.class.symbols[@value] : nil)
63
+ end
64
+
65
+ end
66
+
67
+ end
68
+
69
+ end
@@ -0,0 +1,73 @@
1
+ # Copyright (c) 2016 Cameron Harper
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ # this software and associated documentation files (the "Software"), to deal in
5
+ # the Software without restriction, including without limitation the rights to
6
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
+ # the Software, and to permit persons to whom the Software is furnished to do so,
8
+ # subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all
11
+ # copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
+
20
+ module SlowBlink::Message
21
+
22
+ module Field
23
+
24
+ module CLASS
25
+
26
+ # @return [true,false] field is optional?
27
+ def opt?
28
+ @opt
29
+ end
30
+
31
+ # @return [String] field name
32
+ def name
33
+ @name
34
+ end
35
+
36
+ # @return [Integer,nil] field ID
37
+ def id
38
+ @id
39
+ end
40
+
41
+ def type
42
+ @type
43
+ end
44
+
45
+ def from_compact!(input)
46
+ @type.from_compact!(input)
47
+ end
48
+
49
+ end
50
+
51
+ module INSTANCE
52
+
53
+ def initialize(value)
54
+ @value = self.class.type.new(value)
55
+ end
56
+
57
+ def set(value)
58
+ @value.set(value)
59
+ end
60
+
61
+ def get
62
+ @value.get
63
+ end
64
+
65
+ def to_compact(out)
66
+ @value.to_compact(out)
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ end
@@ -0,0 +1,84 @@
1
+ # Copyright (c) 2016 Cameron Harper
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ # this software and associated documentation files (the "Software"), to deal in
5
+ # the Software without restriction, including without limitation the rights to
6
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
+ # the Software, and to permit persons to whom the Software is furnished to do so,
8
+ # subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all
11
+ # copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
+
20
+ module SlowBlink::Message
21
+
22
+ module FIXED
23
+
24
+ module CLASS
25
+
26
+ def from_compact!(input)
27
+ if opt?
28
+ self.new(input.getFixedOptional!)
29
+ else
30
+ self.new(input.getFixed!)
31
+ end
32
+ end
33
+
34
+ def size
35
+ @type.size
36
+ end
37
+
38
+ end
39
+
40
+ module INSTANCE
41
+
42
+ def set(value)
43
+ if value
44
+ if value.kind_of? String
45
+ if value.size == self.class.size
46
+ @value = value
47
+ else
48
+ raise Error.new "must be #{@size} bytes"
49
+ end
50
+ else
51
+ raise "expecting string"
52
+ end
53
+ elsif self.class.opt?
54
+ @value = nil
55
+ else
56
+ raise Error.new "value unacceptable"
57
+ end
58
+ end
59
+
60
+ def get
61
+ @value
62
+ end
63
+
64
+ def initialize(value)
65
+ if value
66
+ set(value)
67
+ else
68
+ @value = nil
69
+ end
70
+ end
71
+
72
+ def to_compact(out)
73
+ if self.opt?
74
+ out.putFixedOptional(@value)
75
+ else
76
+ out.putFixed(@value)
77
+ end
78
+ end
79
+
80
+ end
81
+
82
+ end
83
+
84
+ end