capnp 0.0.1

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.
@@ -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