capnp 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ # typed: strict
2
+
3
+ require_relative "runtime"
4
+ require_relative "generator/generator"
@@ -0,0 +1,62 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ module Capnp::Buffer
7
+ extend T::Sig
8
+ extend T::Helpers
9
+ interface!
10
+
11
+ sig { abstract.params(offset: Integer, length: Integer).returns(String) }
12
+ def read_string(offset, length)
13
+ end
14
+
15
+ sig { abstract.params(offset: Integer, length: Integer).returns(String) }
16
+ def read_bytes(offset, length)
17
+ end
18
+
19
+ sig { abstract.params(offset: Integer).returns(Integer) }
20
+ def read_u8(offset)
21
+ end
22
+
23
+ sig { abstract.params(offset: Integer).returns(Integer) }
24
+ def read_u16(offset)
25
+ end
26
+
27
+ sig { abstract.params(offset: Integer).returns(Integer) }
28
+ def read_u32(offset)
29
+ end
30
+
31
+ sig { abstract.params(offset: Integer).returns(Integer) }
32
+ def read_u64(offset)
33
+ end
34
+
35
+ sig { abstract.params(offset: Integer).returns(Integer) }
36
+ def read_s8(offset)
37
+ end
38
+
39
+ sig { abstract.params(offset: Integer).returns(Integer) }
40
+ def read_s16(offset)
41
+ end
42
+
43
+ sig { abstract.params(offset: Integer).returns(Integer) }
44
+ def read_s32(offset)
45
+ end
46
+
47
+ sig { abstract.params(offset: Integer).returns(Integer) }
48
+ def read_s64(offset)
49
+ end
50
+
51
+ sig { abstract.params(offset: Integer).returns(Float) }
52
+ def read_f32(offset)
53
+ end
54
+
55
+ sig { abstract.params(offset: Integer).returns(Float) }
56
+ def read_f64(offset)
57
+ end
58
+
59
+ sig { abstract.returns(Integer) }
60
+ def size
61
+ end
62
+ end
@@ -0,0 +1,85 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require_relative "sliceable_buffer"
6
+
7
+ class Capnp::IOBuffer
8
+ extend T::Sig
9
+ include Capnp::SliceableBuffer
10
+
11
+ sig { params(buffer: IO::Buffer).void }
12
+ def initialize(buffer)
13
+ @buffer = buffer
14
+ end
15
+
16
+ sig { override.params(offset: Integer, length: Integer).returns(T.self_type) }
17
+ def slice(offset, length)
18
+ self.class.new(@buffer.slice(offset, length))
19
+ end
20
+
21
+ sig { override.params(offset: Integer, length: Integer).returns(String) }
22
+ def read_string(offset, length)
23
+ @buffer.get_string(offset, length, Encoding::UTF_8)
24
+ end
25
+
26
+ sig { override.params(offset: Integer, length: Integer).returns(String) }
27
+ def read_bytes(offset, length)
28
+ @buffer.get_string(offset, length, Encoding::BINARY)
29
+ end
30
+
31
+ sig { override.params(offset: Integer).returns(Integer) }
32
+ def read_u8(offset)
33
+ T.cast(@buffer.get_value(:U8, offset), Integer)
34
+ end
35
+
36
+ sig { override.params(offset: Integer).returns(Integer) }
37
+ def read_u16(offset)
38
+ T.cast(@buffer.get_value(:u16, offset), Integer)
39
+ end
40
+
41
+ sig { override.params(offset: Integer).returns(Integer) }
42
+ def read_u32(offset)
43
+ T.cast(@buffer.get_value(:u32, offset), Integer)
44
+ end
45
+
46
+ sig { override.params(offset: Integer).returns(Integer) }
47
+ def read_u64(offset)
48
+ T.cast(@buffer.get_value(:u64, offset), Integer)
49
+ end
50
+
51
+ sig { override.params(offset: Integer).returns(Integer) }
52
+ def read_s8(offset)
53
+ T.cast(@buffer.get_value(:S8, offset), Integer)
54
+ end
55
+
56
+ sig { override.params(offset: Integer).returns(Integer) }
57
+ def read_s16(offset)
58
+ T.cast(@buffer.get_value(:s16, offset), Integer)
59
+ end
60
+
61
+ sig { override.params(offset: Integer).returns(Integer) }
62
+ def read_s32(offset)
63
+ T.cast(@buffer.get_value(:s32, offset), Integer)
64
+ end
65
+
66
+ sig { override.params(offset: Integer).returns(Integer) }
67
+ def read_s64(offset)
68
+ T.cast(@buffer.get_value(:s64, offset), Integer)
69
+ end
70
+
71
+ sig { override.params(offset: Integer).returns(Float) }
72
+ def read_f32(offset)
73
+ T.cast(@buffer.get_value(:f32, offset), Float)
74
+ end
75
+
76
+ sig { override.params(offset: Integer).returns(Float) }
77
+ def read_f64(offset)
78
+ T.cast(@buffer.get_value(:f64, offset), Float)
79
+ end
80
+
81
+ sig { override.returns(Integer) }
82
+ def size
83
+ @buffer.size
84
+ end
85
+ end
@@ -0,0 +1,16 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ module Capnp::SliceableBuffer
7
+ extend T::Sig
8
+ extend T::Helpers
9
+ interface!
10
+
11
+ include Capnp::Buffer
12
+
13
+ sig { abstract.params(offset: Integer, length: Integer).returns(T.self_type) }
14
+ def slice(offset, length)
15
+ end
16
+ end
@@ -0,0 +1,88 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require_relative "sliceable_buffer"
6
+
7
+ class Capnp::StringBuffer
8
+ extend T::Sig
9
+
10
+ include Capnp::SliceableBuffer
11
+
12
+ sig { params(buffer: String).void }
13
+ def initialize(buffer)
14
+ @buffer = T.let(buffer.encode(Encoding::BINARY), String)
15
+ end
16
+
17
+ sig { override.params(offset: Integer, length: Integer).returns(T.self_type) }
18
+ def slice(offset, length)
19
+ self.class.new(read_bytes(offset, length))
20
+ end
21
+
22
+ sig { override.returns(Integer) }
23
+ def size
24
+ @buffer.bytesize
25
+ end
26
+
27
+ sig { override.params(offset: Integer, length: Integer).returns(String) }
28
+ def read_string(offset, length)
29
+ read_bytes(offset, length).encode!(Encoding::UTF_8)
30
+ end
31
+
32
+ sig { override.params(offset: Integer, length: Integer).returns(String) }
33
+ def read_bytes(offset, length)
34
+ slice = @buffer.byteslice(offset, length)
35
+ raise Capnp::Error.new("Offset+length exceeds data size") if slice.nil? || slice.bytesize != length
36
+ slice
37
+ end
38
+
39
+ sig { override.params(offset: Integer).returns(Integer) }
40
+ def read_u8(offset)
41
+ T.cast(read_bytes(offset, 1).unpack1("C"), Integer)
42
+ end
43
+
44
+ sig { override.params(offset: Integer).returns(Integer) }
45
+ def read_u16(offset)
46
+ T.cast(read_bytes(offset, 2).unpack1("S<"), Integer)
47
+ end
48
+
49
+ sig { override.params(offset: Integer).returns(Integer) }
50
+ def read_u32(offset)
51
+ T.cast(read_bytes(offset, 4).unpack1("L<"), Integer)
52
+ end
53
+
54
+ sig { override.params(offset: Integer).returns(Integer) }
55
+ def read_u64(offset)
56
+ T.cast(read_bytes(offset, 8).unpack1("Q<"), Integer)
57
+ end
58
+
59
+ sig { override.params(offset: Integer).returns(Integer) }
60
+ def read_s8(offset)
61
+ T.cast(read_bytes(offset, 1).unpack1("c"), Integer)
62
+ end
63
+
64
+ sig { override.params(offset: Integer).returns(Integer) }
65
+ def read_s16(offset)
66
+ T.cast(read_bytes(offset, 2).unpack1("s<"), Integer)
67
+ end
68
+
69
+ sig { override.params(offset: Integer).returns(Integer) }
70
+ def read_s32(offset)
71
+ T.cast(read_bytes(offset, 4).unpack1("l<"), Integer)
72
+ end
73
+
74
+ sig { override.params(offset: Integer).returns(Integer) }
75
+ def read_s64(offset)
76
+ T.cast(read_bytes(offset, 8).unpack1("q<"), Integer)
77
+ end
78
+
79
+ sig { override.params(offset: Integer).returns(Float) }
80
+ def read_f32(offset)
81
+ T.cast(read_bytes(offset, 4).unpack1("e"), Float)
82
+ end
83
+
84
+ sig { override.params(offset: Integer).returns(Float) }
85
+ def read_f64(offset)
86
+ T.cast(read_bytes(offset, 8).unpack1("E"), Float)
87
+ end
88
+ end
@@ -0,0 +1,19 @@
1
+ # typed: strict
2
+
3
+ require "sorbet-runtime"
4
+ require_relative "list"
5
+
6
+ class Capnp::Data < Capnp::BufferList
7
+ Elem = type_member { {fixed: Integer} }
8
+
9
+ sig { returns(String) }
10
+ def value = @data.read_bytes(0, @length)
11
+
12
+ sig { override.params(ix: Integer).returns(Elem) }
13
+ private def get(ix)
14
+ @data.read_u8(ix)
15
+ end
16
+
17
+ sig { override.returns(Object) }
18
+ def to_obj = value
19
+ end
@@ -0,0 +1,100 @@
1
+ # typed: strict
2
+
3
+ require "sorbet-runtime"
4
+ require_relative "../list"
5
+
6
+ class Capnp::BufferList
7
+ include Capnp::List
8
+ extend T::Sig
9
+ extend T::Generic
10
+ extend T::Helpers
11
+
12
+ abstract!
13
+
14
+ Elem = type_member(:out)
15
+
16
+ private_class_method :new
17
+
18
+ sig do
19
+ params(
20
+ data: Capnp::Reference,
21
+ length: Integer,
22
+ element_type: Integer,
23
+ element_size: Integer,
24
+ data_words: Integer,
25
+ pointer_words: Integer
26
+ ).void
27
+ end
28
+ def initialize(data, length, element_type, element_size, data_words, pointer_words)
29
+ @data = data
30
+ @length = length
31
+ @element_type = element_type
32
+ @element_size = element_size
33
+ @data_words = data_words
34
+ @pointer_words = pointer_words
35
+ end
36
+
37
+ sig { params(pointer_ref: Capnp::Reference).returns(T.nilable(T.attached_class)) }
38
+ def self.from_pointer(pointer_ref)
39
+ # Process far pointers
40
+ pointer_ref, content_ref = pointer_ref.segment.message.dereference_pointer(pointer_ref)
41
+
42
+ # Grab lower 32 bits as offset and upper 32 bits as size
43
+ pointer_data = pointer_ref.read_bytes(0, Capnp::WORD_SIZE)
44
+ offset_part, size_part = T.cast(pointer_data.unpack("l<L<"), [Integer, Integer])
45
+
46
+ # Check for NULL pointer
47
+ return nil if offset_part.zero? && size_part.zero?
48
+
49
+ # Check this is a list pointer
50
+ pointer_type = offset_part & 0b11
51
+ raise Capnp::Error.new("List pointer has type #{pointer_type}") unless pointer_type == 1
52
+
53
+ # Determine the length of the list
54
+ length = size_part >> 3
55
+
56
+ # Determine the size of the data section and individual elements
57
+ element_type = size_part & 0b111
58
+ element_size = case element_type
59
+ # Void type elements
60
+ when 0 then 0
61
+ # Bit type elements
62
+ when 1 then 1
63
+ # Integer type elements
64
+ when 2, 3, 4, 5 then 1 << (element_type - 2)
65
+ # Pointer type elements
66
+ when 6 then Capnp::WORD_SIZE
67
+ # Composite type elements
68
+ else
69
+ 0 # (Set below)
70
+ end
71
+
72
+ # Extract data section
73
+ if content_ref.nil?
74
+ data_offset = ((offset_part >> 2) + 1) * Capnp::WORD_SIZE
75
+ data_ref = pointer_ref.offset_position(data_offset)
76
+ else
77
+ data_ref = content_ref
78
+ end
79
+
80
+ # Fetch tag for composite type elements
81
+ data_words = 0
82
+ pointers_words = 0
83
+ if element_type == 7
84
+ # Decode tag as a struct pointer
85
+ length, data_words, pointers_words = Capnp::Struct.decode_pointer(data_ref)
86
+ data_ref = data_ref.offset_position(Capnp::WORD_SIZE)
87
+
88
+ # Calculate element size
89
+ element_size = (data_words + pointers_words) * Capnp::WORD_SIZE
90
+ end
91
+
92
+ new(data_ref, length, element_type, element_size, data_words, pointers_words)
93
+ end
94
+
95
+ sig { override.returns(Integer) }
96
+ attr_reader :length
97
+
98
+ sig { returns(Integer) }
99
+ attr_reader :element_type
100
+ end
@@ -0,0 +1,103 @@
1
+ # typed: strict
2
+
3
+ require "sorbet-runtime"
4
+ require_relative "list"
5
+
6
+ class Capnp::NumericList < Capnp::BufferList
7
+ abstract!
8
+
9
+ Elem = type_member(:out)
10
+
11
+ sig { override.returns(Object) }
12
+ def to_obj = to_a
13
+ end
14
+
15
+ class Capnp::U8List < Capnp::NumericList
16
+ Elem = type_member { {fixed: Integer} }
17
+
18
+ sig { override.params(ix: Integer).returns(Elem) }
19
+ private def get(ix)
20
+ @data.read_u8(ix)
21
+ end
22
+ end
23
+
24
+ class Capnp::U16List < Capnp::NumericList
25
+ Elem = type_member { {fixed: Integer} }
26
+
27
+ sig { override.params(ix: Integer).returns(Elem) }
28
+ private def get(ix)
29
+ @data.read_u16(ix * 2)
30
+ end
31
+ end
32
+
33
+ class Capnp::U32List < Capnp::NumericList
34
+ Elem = type_member { {fixed: Integer} }
35
+
36
+ sig { override.params(ix: Integer).returns(Elem) }
37
+ private def get(ix)
38
+ @data.read_u32(ix * 4)
39
+ end
40
+ end
41
+
42
+ class Capnp::U64List < Capnp::NumericList
43
+ Elem = type_member { {fixed: Integer} }
44
+
45
+ sig { override.params(ix: Integer).returns(Elem) }
46
+ private def get(ix)
47
+ @data.read_u64(ix * 8)
48
+ end
49
+ end
50
+
51
+ class Capnp::S8List < Capnp::NumericList
52
+ Elem = type_member { {fixed: Integer} }
53
+
54
+ sig { override.params(ix: Integer).returns(Elem) }
55
+ private def get(ix)
56
+ @data.read_s8(ix)
57
+ end
58
+ end
59
+
60
+ class Capnp::S16List < Capnp::NumericList
61
+ Elem = type_member { {fixed: Integer} }
62
+
63
+ sig { override.params(ix: Integer).returns(Elem) }
64
+ private def get(ix)
65
+ @data.read_s16(ix * 2)
66
+ end
67
+ end
68
+
69
+ class Capnp::S32List < Capnp::NumericList
70
+ Elem = type_member { {fixed: Integer} }
71
+
72
+ sig { override.params(ix: Integer).returns(Elem) }
73
+ private def get(ix)
74
+ @data.read_s32(ix * 4)
75
+ end
76
+ end
77
+
78
+ class Capnp::S64List < Capnp::NumericList
79
+ Elem = type_member { {fixed: Integer} }
80
+
81
+ sig { override.params(ix: Integer).returns(Elem) }
82
+ private def get(ix)
83
+ @data.read_s64(ix * 8)
84
+ end
85
+ end
86
+
87
+ class Capnp::F32List < Capnp::NumericList
88
+ Elem = type_member { {fixed: Float} }
89
+
90
+ sig { override.params(ix: Integer).returns(Elem) }
91
+ private def get(ix)
92
+ @data.read_f32(ix * 4)
93
+ end
94
+ end
95
+
96
+ class Capnp::F64List < Capnp::NumericList
97
+ Elem = type_member { {fixed: Float} }
98
+
99
+ sig { override.params(ix: Integer).returns(Elem) }
100
+ private def get(ix)
101
+ @data.read_f64(ix * 8)
102
+ end
103
+ end
@@ -0,0 +1,19 @@
1
+ # typed: strict
2
+
3
+ require "sorbet-runtime"
4
+ require_relative "list"
5
+ require_relative "../string"
6
+
7
+ class Capnp::BufferString < Capnp::BufferList
8
+ include Capnp::String
9
+
10
+ Elem = type_member { {fixed: String} }
11
+
12
+ sig { override.returns(String) }
13
+ def to_s = @data.read_string(0, @length - 1)
14
+
15
+ sig { override.params(ix: Integer).returns(Elem) }
16
+ private def get(ix)
17
+ @data.read_string(ix, 1)
18
+ end
19
+ end
@@ -0,0 +1,47 @@
1
+ # typed: strict
2
+
3
+ require "sorbet-runtime"
4
+ require_relative "list"
5
+
6
+ class Capnp::StructList < Capnp::BufferList
7
+ abstract!
8
+
9
+ Elem = type_member { {upper: Capnp::Struct} }
10
+
11
+ sig { abstract.returns(T::Class[Elem]) }
12
+ def element_class
13
+ end
14
+
15
+ sig { override.params(ix: Integer).returns(Elem) }
16
+ private def get(ix)
17
+ case @element_type
18
+ # Void type elements
19
+ when 0 then element_class.new(Capnp::Reference::EMPTY, 0, Capnp::Reference::EMPTY, 0)
20
+
21
+ # Bit type elements
22
+ when 1 then raise "Bit lists may not be decoded as structs"
23
+
24
+ # Integer type elements
25
+ when 2, 3, 4, 5
26
+ data_offset = ix * @element_size
27
+ element_class.new(@data.offset_position(data_offset), @element_size, Capnp::Reference::EMPTY, 0)
28
+
29
+ # Pointer type elements
30
+ when 6
31
+ data_offset = ix * @element_size
32
+ element_class.new(Capnp::Reference::EMPTY, 0, @data.offset_position(data_offset), @element_size)
33
+
34
+ # Composite type elements
35
+ else
36
+ data_offset = ix * @element_size
37
+ data_size = @data_words * Capnp::WORD_SIZE
38
+ data_ref = @data.offset_position(data_offset)
39
+ pointers_size = @pointer_words * Capnp::WORD_SIZE
40
+ pointers_ref = @data.offset_position(data_offset + data_size)
41
+ element_class.new(data_ref, data_size, pointers_ref, pointers_size)
42
+ end
43
+ end
44
+
45
+ sig { override.returns(Object) }
46
+ def to_obj = map(&:to_obj)
47
+ end
@@ -0,0 +1,42 @@
1
+ # typed: strict
2
+
3
+ require "sorbet-runtime"
4
+
5
+ module Capnp::List
6
+ include Kernel
7
+ include Enumerable
8
+ extend T::Sig
9
+ extend T::Generic
10
+ extend T::Helpers
11
+
12
+ abstract!
13
+
14
+ Elem = type_member(:out)
15
+
16
+ sig { abstract.returns(Integer) }
17
+ def length
18
+ end
19
+
20
+ # Get a single element at the given index
21
+ # THE INDEX MUST BE IN RANGE.
22
+ sig { abstract.params(ix: Integer).returns(Elem) }
23
+ private def get(ix)
24
+ end
25
+
26
+ sig { params(ix: Integer).returns(T.nilable(Elem)) }
27
+ def [](ix)
28
+ return if ix < 0 || ix >= length
29
+ get(ix)
30
+ end
31
+
32
+ sig { override.params(blk: T.proc.params(arg0: Elem).returns(BasicObject)).void }
33
+ def each(&blk)
34
+ length.times do |ix|
35
+ blk.call(get(ix))
36
+ end
37
+ end
38
+
39
+ sig { abstract.returns(Object) }
40
+ def to_obj
41
+ end
42
+ end
@@ -0,0 +1,26 @@
1
+ # typed: strict
2
+
3
+ require "sorbet-runtime"
4
+ require_relative "../list"
5
+
6
+ class Capnp::ObjectList
7
+ include Capnp::List
8
+ extend T::Sig
9
+ extend T::Generic
10
+
11
+ Elem = type_member(:out)
12
+
13
+ sig { params(array: T::Array[Elem]).void }
14
+ def initialize(array)
15
+ @array = array
16
+ end
17
+
18
+ sig { override.params(ix: Integer).returns(Elem) }
19
+ private def get(ix) = @array.fetch(ix)
20
+
21
+ sig { override.returns(Integer) }
22
+ def length = @array.length
23
+
24
+ sig { override.returns(Object) }
25
+ def to_obj = @array
26
+ end
@@ -0,0 +1,26 @@
1
+ # typed: strict
2
+
3
+ require "sorbet-runtime"
4
+ require_relative "../string"
5
+
6
+ class Capnp::ObjectString
7
+ include Capnp::String
8
+ extend T::Sig
9
+ extend T::Generic
10
+
11
+ Elem = type_member { {fixed: String} }
12
+
13
+ sig { params(string: String).void }
14
+ def initialize(string)
15
+ @string = T.let(string.freeze, String)
16
+ end
17
+
18
+ sig { override.returns(String) }
19
+ def to_s = @string
20
+
21
+ sig { override.params(ix: Integer).returns(Elem) }
22
+ private def get(ix) = T.must(@string[ix])
23
+
24
+ sig { override.returns(Integer) }
25
+ def length = @string.length
26
+ end
@@ -0,0 +1,22 @@
1
+ # typed: strict
2
+
3
+ require "sorbet-runtime"
4
+ require_relative "list"
5
+
6
+ module Capnp::String
7
+ include Capnp::List
8
+ extend T::Sig
9
+ extend T::Generic
10
+ extend T::Helpers
11
+
12
+ abstract!
13
+
14
+ Elem = type_member { {fixed: String} }
15
+
16
+ sig { abstract.returns(String) }
17
+ def to_s
18
+ end
19
+
20
+ sig { override.returns(Object) }
21
+ def to_obj = to_s
22
+ end
@@ -0,0 +1,21 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require_relative "message"
6
+ require_relative "../segment"
7
+
8
+ class Capnp::FlatMessage < Capnp::Message
9
+ extend T::Sig
10
+
11
+ sig { params(segment: Capnp::Buffer).void }
12
+ def initialize(segment)
13
+ @segment = T.let(Capnp::Segment.new(self, segment), Capnp::Segment)
14
+ end
15
+
16
+ sig { override.params(id: Integer).returns(Capnp::Segment) }
17
+ def segment(id)
18
+ raise Capnp::Error.new("Unknown Segment ID #{id}") unless id.zero?
19
+ @segment
20
+ end
21
+ end