ciborium 0.1.0

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 (63) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +9 -0
  3. data/LICENSE.txt +21 -0
  4. data/NOTICE.md +26 -0
  5. data/README.md +221 -0
  6. data/Rakefile +46 -0
  7. data/ext/ciborium/Cargo.lock +339 -0
  8. data/ext/ciborium/Cargo.toml +26 -0
  9. data/ext/ciborium/build.rs +4 -0
  10. data/ext/ciborium/extconf.rb +8 -0
  11. data/ext/ciborium/src/canonical.rs +60 -0
  12. data/ext/ciborium/src/cursor.rs +106 -0
  13. data/ext/ciborium/src/decode.rs +325 -0
  14. data/ext/ciborium/src/encode.rs +330 -0
  15. data/ext/ciborium/src/error.rs +53 -0
  16. data/ext/ciborium/src/lib.rs +153 -0
  17. data/ext/ciborium/src/scan.rs +223 -0
  18. data/lib/ciborium/compat/buffer.rb +190 -0
  19. data/lib/ciborium/compat/errors.rb +30 -0
  20. data/lib/ciborium/compat/packer.rb +90 -0
  21. data/lib/ciborium/compat/unpacker.rb +111 -0
  22. data/lib/ciborium/compat.rb +110 -0
  23. data/lib/ciborium/decode_options.rb +61 -0
  24. data/lib/ciborium/decoder.rb +141 -0
  25. data/lib/ciborium/encode_options.rb +41 -0
  26. data/lib/ciborium/encoded.rb +10 -0
  27. data/lib/ciborium/encoder.rb +80 -0
  28. data/lib/ciborium/errors.rb +25 -0
  29. data/lib/ciborium/extensions/bignum.rb +35 -0
  30. data/lib/ciborium/extensions/regexp.rb +41 -0
  31. data/lib/ciborium/extensions/time.rb +39 -0
  32. data/lib/ciborium/extensions/uri.rb +29 -0
  33. data/lib/ciborium/extensions.rb +92 -0
  34. data/lib/ciborium/native.rb +25 -0
  35. data/lib/ciborium/replace.rb +105 -0
  36. data/lib/ciborium/simple.rb +21 -0
  37. data/lib/ciborium/tagged.rb +18 -0
  38. data/lib/ciborium/version.rb +6 -0
  39. data/lib/ciborium.rb +65 -0
  40. data/sig/generated/ciborium/compat/buffer.rbs +95 -0
  41. data/sig/generated/ciborium/compat/errors.rbs +23 -0
  42. data/sig/generated/ciborium/compat/packer.rbs +53 -0
  43. data/sig/generated/ciborium/compat/unpacker.rbs +59 -0
  44. data/sig/generated/ciborium/compat.rbs +57 -0
  45. data/sig/generated/ciborium/decode_options.rbs +41 -0
  46. data/sig/generated/ciborium/decoder.rbs +85 -0
  47. data/sig/generated/ciborium/encode_options.rbs +33 -0
  48. data/sig/generated/ciborium/encoded.rbs +16 -0
  49. data/sig/generated/ciborium/encoder.rbs +50 -0
  50. data/sig/generated/ciborium/errors.rbs +32 -0
  51. data/sig/generated/ciborium/extensions/bignum.rbs +20 -0
  52. data/sig/generated/ciborium/extensions/regexp.rbs +30 -0
  53. data/sig/generated/ciborium/extensions/time.rbs +22 -0
  54. data/sig/generated/ciborium/extensions/uri.rbs +20 -0
  55. data/sig/generated/ciborium/extensions.rbs +35 -0
  56. data/sig/generated/ciborium/native.rbs +10 -0
  57. data/sig/generated/ciborium/replace.rbs +37 -0
  58. data/sig/generated/ciborium/version.rbs +5 -0
  59. data/sig/generated/ciborium.rbs +30 -0
  60. data/sig/manual/ciborium/extensions.rbs +12 -0
  61. data/sig/manual/ciborium/native.rbs +23 -0
  62. data/sig/manual/ciborium/tagged.rbs +25 -0
  63. metadata +123 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 134062e0f9eac0198937cb3b75bf5fa10e5d2d164c2115e665d447b44fbf1ecb
4
+ data.tar.gz: c1a7df490adfd99e368e960543a1334fb7faefda53634669d91f10ae29137d8a
5
+ SHA512:
6
+ metadata.gz: 408467f3bab40ca8c346807f11df507f5e0c7a038f2891f2bba7a276bff23b40ed380ea04a424c6dd102a62ba4bfbae38520ce4c85328ce1dc018501ac584a3a
7
+ data.tar.gz: 98a49f65d0d2888e3fa6aa4f5944ab1b6602deeb5d7e79c6f2d298c61161eb9ed9fe0abb50cf292ab5f0bc2f14abce659a5628ea0157cde1d9be6148d2cea281
data/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 (2026-11-11)
4
+
5
+ - Initial release: a CBOR encoder and decoder backed by a Rust extension, where tags carry meaning only through allowlisted extensions.
6
+ - Built-in extensions for bignums, Time, URI and Regexp.
7
+ - `profile: :ctap2` for the CTAP2 canonical CBOR encoding form that WebAuthn uses.
8
+ - `Ciborium::Compat` and `ciborium/replace`, a stand-in for the cbor gem's interface.
9
+ - RBS signatures under `sig/`.
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2026 Sorah Fukumori
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/NOTICE.md ADDED
@@ -0,0 +1,26 @@
1
+ # Notices
2
+
3
+ ## Compiled into the native extension
4
+
5
+ | Crate | License |
6
+ |---|---|
7
+ | [ciborium-ll](https://github.com/enarx/ciborium), ciborium-io | Apache-2.0 |
8
+ | [magnus](https://github.com/matsadler/magnus) | MIT |
9
+ | [rb-sys](https://github.com/oxidize-rb/rb-sys) | MIT OR Apache-2.0 |
10
+ | [half](https://github.com/VoidStarKat/half-rs) | MIT OR Apache-2.0 |
11
+ | [cfg-if](https://github.com/rust-lang/cfg-if) | MIT OR Apache-2.0 |
12
+ | [zerocopy](https://github.com/google/zerocopy) | BSD-2-Clause OR Apache-2.0 OR MIT |
13
+
14
+ The source gem builds these from crates.io. Precompiled gems carry their license texts under
15
+ `licenses/`.
16
+
17
+ ## Test fixtures
18
+
19
+ `spec/fixtures/webauthn/` holds attestation objects taken from the test suite of
20
+ [webauthn-ruby](https://github.com/cedarcode/webauthn-ruby) (`spec/support/seeds.rb` at v3.5.0),
21
+ which is available under the MIT License.
22
+
23
+ `spec/upstream/` holds the specs of [cbor-ruby](https://github.com/cabo/cbor-ruby) (the cbor gem,
24
+ `spec/` at commit 89e94f3b059deb58478eab51996f764fcc6ecd82), copied unmodified except for
25
+ `spec_helper.rb`, which is replaced. cbor-ruby is available under the Apache License 2.0, a copy
26
+ of which is in `spec/upstream/LICENSE.txt`.
data/README.md ADDED
@@ -0,0 +1,221 @@
1
+ # Ciborium: CBOR for Ruby without surprises from the input
2
+
3
+ Ciborium is a [CBOR](https://www.rfc-editor.org/rfc/rfc8949) encoder and decoder for Ruby, backed by a Rust extension built on [ciborium-ll](https://crates.io/crates/ciborium-ll).
4
+
5
+ It also ships a compatibility layer for the [cbor](https://rubygems.org/gems/cbor) gem. `require "ciborium/replace"` makes `CBOR` refer to Ciborium, so gems written against the cbor gem, such as [webauthn](https://github.com/cedarcode/webauthn-ruby) and [cose](https://github.com/cedarcode/cose-ruby), run on Ciborium unchanged.
6
+
7
+ ## Why
8
+
9
+ The cbor gem is a fork of msgpack-ruby's C extension with CBOR support added on top, and has not followed the memory-safety fixes msgpack-ruby made since.
10
+
11
+ Ciborium is a fresh implementation:
12
+
13
+ - **Memory safety**: parsing and serialization happen in Rust. Nesting is bounded by `max_depth` in both directions, and the decoder needs no recursion.
14
+ - **Strict by default**: tags are not interpreted unless an extension is allowlisted, and invalid UTF-8, malformed simple values, duplicate map keys and trailing bytes all raise.
15
+ - **CTAP2 canonical form**: `profile: :ctap2` validates and produces the encoding WebAuthn requires.
16
+ - **RBS signatures** are shipped in `sig/`.
17
+
18
+ ## Installation
19
+
20
+ ```
21
+ bundle add ciborium
22
+ ```
23
+
24
+ Ciborium requires Ruby 3.3 or later.
25
+
26
+ | Platform | Precompiled gem |
27
+ |---|---|
28
+ | Linux x86_64 and aarch64, glibc 2.34 or later | `x86_64-linux-gnu`, `aarch64-linux-gnu` |
29
+ | Linux x86_64 and aarch64, musl | `x86_64-linux-musl`, `aarch64-linux-musl` |
30
+ | Linux armv7, glibc 2.31 or later | `arm-linux-gnu` |
31
+ | macOS 11 or later on Apple silicon | `arm64-darwin` |
32
+ | Windows x64 | `x64-mingw-ucrt` |
33
+
34
+ The precompiled gems carry the extension for Ruby 3.3, 3.4 and 4.0. Anywhere else the source gem builds the extension, which needs a Rust toolchain and libclang (for [rb-sys](https://github.com/oxidize-rb/rb-sys)).
35
+
36
+ ## Usage
37
+
38
+ ```ruby
39
+ require "ciborium"
40
+
41
+ bytes = Ciborium.encode({"name" => "ciborium", "tags" => [1, 2.5, nil]})
42
+ Ciborium.decode(bytes) #=> {"name" => "ciborium", "tags" => [1, 2.5, nil]}
43
+
44
+ Ciborium.decode("\xd8\x23\x63a*b".b) #=> #<data Ciborium::Tagged tag=35, value="a*b">
45
+ ```
46
+
47
+ `decode` raises when bytes follow the item. `decode_prefix` returns the item and the number of bytes it took instead, and `decode_sequence` reads an [RFC 8742](https://www.rfc-editor.org/rfc/rfc8742) sequence:
48
+
49
+ ```ruby
50
+ Ciborium.decode_prefix("\x82\x01\x02\xff".b) #=> [[1, 2], 3]
51
+ Ciborium.decode_sequence("\x01\x02".b) #=> [1, 2]
52
+ ```
53
+
54
+ ### Decoding options
55
+
56
+ ```ruby
57
+ Ciborium.decode(bytes,
58
+ extensions: [], # allowlisted extensions, see below
59
+ symbolize_keys: false, # text map keys as (garbage-collectable) Symbols
60
+ max_depth: 128, # nesting limit for arrays, maps and tags
61
+ duplicate_keys: :error, # or :last_wins
62
+ profile: nil, # or :ctap2
63
+ )
64
+ ```
65
+
66
+ ### Encoding
67
+
68
+ | Ruby | CBOR |
69
+ |---|---|
70
+ | `nil`, `true`, `false` | simple values 22, 21, 20 |
71
+ | `Integer` in `-2**64...2**64` | major type 0 or 1, in the shortest form |
72
+ | `Float` | the narrowest float that keeps the value exactly |
73
+ | `String` in `ASCII-8BIT` | byte string |
74
+ | other `String`, `Symbol` | text string, transcoded to UTF-8 |
75
+ | `Array`, `Hash` | array, map, in insertion order |
76
+ | `Ciborium::Tagged`, `Ciborium::Simple` | tag, simple value |
77
+ | `Ciborium::Encoded` | its bytes as-is, after checking they hold one well-formed item |
78
+
79
+ Anything else raises `Ciborium::EncodeError`, unless an extension encodes it or a `fallback` returns something to encode in its place:
80
+
81
+ ```ruby
82
+ Ciborium.encode(Date.today, fallback: ->(date) { date.iso8601 })
83
+ ```
84
+
85
+ ### Streaming
86
+
87
+ ```ruby
88
+ decoder = Ciborium::Decoder.new(symbolize_keys: true)
89
+ until io.eof?
90
+ decoder.feed(io.readpartial(4096))
91
+ decoder.each { |item| handle(item) } # yields only complete items
92
+ end
93
+
94
+ encoder = Ciborium::Encoder.new
95
+ encoder.write_array_header(2).write(1).write("two")
96
+ encoder.bytes #=> "\x82\x01ctwo"
97
+ ```
98
+
99
+ `Decoder` also reads headers (`read_array_header`, `read_map_header`), and offers `skip` and `next_nil?`.
100
+
101
+ ### Errors
102
+
103
+ | Class | Raised when |
104
+ |---|---|
105
+ | `Ciborium::MalformedError` | the input is not well-formed, breaks a strictness rule or the profile, or has trailing bytes |
106
+ | `Ciborium::IncompleteError` | the input ends inside an item |
107
+ | `Ciborium::DepthError` | nesting exceeds `max_depth` |
108
+ | `Ciborium::ExtensionError` | an extension failed to decode a tag; the original error is the `cause` |
109
+ | `Ciborium::UnexpectedTypeError` | a `Decoder` header reader found another type |
110
+ | `Ciborium::EncodeError` | an object cannot be encoded, or an extension or fallback failed |
111
+
112
+ All of them inherit from `Ciborium::Error`, and the decoding ones also from `Ciborium::DecodeError`.
113
+
114
+ ## Extensions
115
+
116
+ An extension gives a tag meaning in both directions. Pass the built-in ones by name:
117
+
118
+ ```ruby
119
+ Ciborium.decode(bytes, extensions: [:bignum, :time])
120
+ Ciborium.encode(Time.now, extensions: [:time])
121
+ ```
122
+
123
+ | Name | Tags | Ruby |
124
+ |---|---|---|
125
+ | `:bignum` | 2, 3 | `Integer` outside `-2**64...2**64` |
126
+ | `:time` | 0, 1 | `Time`. It encodes as tag 1, using an Integer for whole seconds and a Float otherwise |
127
+ | `:uri` | 32 | `URI::Generic` |
128
+ | `:regexp` | 35 | `Regexp` without flags. `Ciborium::Extensions::Regexp.new(timeout: 0.1)` sets a match timeout |
129
+
130
+ An extension builds Ruby objects from the input, so allowlist only those you trust the input with.
131
+
132
+ Any object that responds to `tags`, `classes`, `decode(tag, value)` and `encode(object)` is an extension too:
133
+
134
+ ```ruby
135
+ class PointExtension
136
+ def tags = [40_000]
137
+ def classes = [Point]
138
+ def decode(_tag, (x, y)) = Point.new(x, y)
139
+ def encode(point) = Ciborium::Tagged.new(40_000, [point.x, point.y])
140
+ end
141
+
142
+ Ciborium.decode(bytes, extensions: [PointExtension.new])
143
+ ```
144
+
145
+ ## WebAuthn and the CTAP2 profile
146
+
147
+ WebAuthn encodes everything in the CTAP2 canonical CBOR encoding form ([CTAP 2.2 section 8](https://fidoalliance.org/specs/fido-v2.2-ps-20250714/fido-client-to-authenticator-protocol-v2.2-ps-20250714.html#ctap2-canonical-cbor-encoding-form)). That form uses no tags at all, so WebAuthn data needs no extension. With `profile: :ctap2`, decoding rejects anything outside that form: tags, indefinite lengths, arguments longer than needed, and map keys that are out of order or duplicated. Encoding sorts map keys into canonical order and refuses tags.
148
+
149
+ ```ruby
150
+ attestation = Ciborium.decode(attestation_object, profile: :ctap2)
151
+
152
+ # The credential public key in authenticator data is followed by extension data.
153
+ cose_key, length = Ciborium.decode_prefix(credential_public_key_and_rest, profile: :ctap2)
154
+ ```
155
+
156
+ ## Replacing the cbor gem
157
+
158
+ `Ciborium::Compat` implements the cbor gem's interface on top of Ciborium:
159
+
160
+ - `CBOR.encode`, `CBOR.decode` and their `pack`, `dump`, `unpack` and `load` aliases
161
+ - `Packer`, `Unpacker` and `Buffer`
162
+ - `Tagged`, `Simple`, its error classes, and `to_cbor`
163
+
164
+ `ciborium/replace` installs it as `CBOR` and marks the cbor gem as loaded, so a later `require "cbor"` does nothing. Keep whatever depends on the cbor gem in the Gemfile, and add ciborium without letting Bundler require it:
165
+
166
+ ```ruby
167
+ # Gemfile
168
+ gem "webauthn"
169
+ gem "ciborium", require: false
170
+ ```
171
+
172
+ Then require `ciborium/replace` after Bundler sets up the load path, and before anything requires `cbor`. In a Rails app, that is between these two lines of `config/application.rb`:
173
+
174
+ ```ruby
175
+ # config/application.rb
176
+ require_relative "boot"
177
+ require "rails/all"
178
+
179
+ require "ciborium/replace"
180
+ Bundler.require(*Rails.groups)
181
+ ```
182
+
183
+ Outside Rails, put it after `require "bundler/setup"` and before `Bundler.require` or the first `require "webauthn"`. If the cbor gem was loaded first anyway, `ciborium/replace` warns and replaces `CBOR` regardless.
184
+
185
+ Because callers of the cbor gem cannot pass options, Compat takes its extensions from one process-wide setting. Nothing is allowlisted by default, so big Integers (tags 2 and 3) decode to `Tagged` until `:bignum` is allowlisted:
186
+
187
+ ```ruby
188
+ Ciborium::Compat.extensions = [:bignum, :time]
189
+ ```
190
+
191
+ The specs of webauthn-ruby and cose-ruby run against Compat in CI with this default, so neither needs any tag extension. The cbor gem's own specs run too, both with no extensions and with every built-in one allowlisted.
192
+
193
+ ### Behaviour of Compat
194
+
195
+ Compat follows Ciborium's rules rather than reproducing the cbor gem exactly:
196
+
197
+ - Tags decode to `Tagged` unless allowlisted in `Compat.extensions`, and Integers outside `-2**64...2**64` encode only with `:bignum` allowlisted.
198
+ - Input that is not well-formed or breaks Ciborium's strictness rules raises `MalformedFormatError`, as does an extension failure, with the original error as the `cause`.
199
+ - Encoding raises `EncodeError` on invalid UTF-8, and on a `Regexp` with flags.
200
+ - `Time` encodes subseconds as a Float.
201
+ - `Tagged` and `Simple` are immutable `Data`.
202
+ - `Unpacker#buffer` holds input that has not yet reached the decoder.
203
+
204
+ ## Development
205
+
206
+ ```
207
+ mise install
208
+ bin/setup
209
+ bundle exec rake compile spec spec:upstream steep
210
+ hk check --all
211
+ ```
212
+
213
+ The Rust extension lives in `ext/ciborium`. Signatures are written inline with rbs-inline and generated into `sig/generated` by `rake rbs`. That directory is committed, and CI checks it is current.
214
+
215
+ ## Contributing
216
+
217
+ Bug reports and pull requests are welcome on GitHub at https://github.com/sorah/ciborium-ruby.
218
+
219
+ ## License
220
+
221
+ MIT License, see [LICENSE.txt](./LICENSE.txt). Third-party code compiled into the extension, and test fixtures taken from other projects, are listed in [NOTICE.md](./NOTICE.md).
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+ require "rake/extensiontask"
6
+
7
+ GEMSPEC = Bundler.load_gemspec("ciborium.gemspec")
8
+
9
+ # No gemspec: precompiled gems are assembled by rakelib/native.rake.
10
+ Rake::ExtensionTask.new("ciborium_native") do |ext|
11
+ ext.ext_dir = "ext/ciborium"
12
+ ext.lib_dir = "lib/ciborium"
13
+ ext.source_pattern = "{Cargo.toml,Cargo.lock,build.rs,src/**/*.rs}"
14
+ # Platforms without a native CI runner are cross-compiled inside rb-sys-dock
15
+ # images (see .github/workflows/native.yml).
16
+ ext.cross_compile = true
17
+ ext.cross_platform = %w[x86_64-linux-musl aarch64-linux-musl arm-linux-gnueabihf]
18
+ end
19
+
20
+ RSpec::Core::RakeTask.new(:spec)
21
+ task spec: :compile
22
+
23
+ namespace :spec do
24
+ desc "Run the cbor gem's specs against Ciborium::Compat, with default and with all extensions"
25
+ task upstream: :compile do
26
+ ["default", "all"].each do |mode|
27
+ sh(
28
+ {"CIBORIUM_UPSTREAM_EXTENSIONS" => mode}, "rspec", "--options", "spec/upstream/.rspec", "-I", "spec/upstream",
29
+ "--default-path", "spec/upstream", "spec/upstream"
30
+ )
31
+ end
32
+ end
33
+ end
34
+
35
+ desc "Regenerate inline RBS signatures under sig/generated"
36
+ task :rbs do
37
+ sh "rbs-inline --output=sig/generated lib"
38
+ sh "rbs -r time -r uri -I sig/generated -I sig/manual -I sig-stub validate"
39
+ end
40
+
41
+ desc "Type check lib against the RBS signatures"
42
+ task steep: :rbs do
43
+ sh "steep check"
44
+ end
45
+
46
+ task default: [:spec, "spec:upstream", :steep]
@@ -0,0 +1,339 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "aho-corasick"
7
+ version = "1.1.5"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
10
+ dependencies = [
11
+ "memchr",
12
+ ]
13
+
14
+ [[package]]
15
+ name = "bindgen"
16
+ version = "0.72.1"
17
+ source = "registry+https://github.com/rust-lang/crates.io-index"
18
+ checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895"
19
+ dependencies = [
20
+ "bitflags",
21
+ "cexpr",
22
+ "clang-sys",
23
+ "itertools",
24
+ "proc-macro2",
25
+ "quote",
26
+ "regex",
27
+ "rustc-hash",
28
+ "shlex",
29
+ "syn",
30
+ ]
31
+
32
+ [[package]]
33
+ name = "bitflags"
34
+ version = "2.13.2"
35
+ source = "registry+https://github.com/rust-lang/crates.io-index"
36
+ checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06"
37
+
38
+ [[package]]
39
+ name = "cexpr"
40
+ version = "0.6.0"
41
+ source = "registry+https://github.com/rust-lang/crates.io-index"
42
+ checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
43
+ dependencies = [
44
+ "nom",
45
+ ]
46
+
47
+ [[package]]
48
+ name = "cfg-if"
49
+ version = "1.0.5"
50
+ source = "registry+https://github.com/rust-lang/crates.io-index"
51
+ checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600"
52
+
53
+ [[package]]
54
+ name = "ciborium-io"
55
+ version = "0.2.2"
56
+ source = "registry+https://github.com/rust-lang/crates.io-index"
57
+ checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
58
+
59
+ [[package]]
60
+ name = "ciborium-ll"
61
+ version = "0.2.2"
62
+ source = "registry+https://github.com/rust-lang/crates.io-index"
63
+ checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
64
+ dependencies = [
65
+ "ciborium-io",
66
+ "half",
67
+ ]
68
+
69
+ [[package]]
70
+ name = "ciborium_native"
71
+ version = "0.1.0"
72
+ dependencies = [
73
+ "ciborium-io",
74
+ "ciborium-ll",
75
+ "half",
76
+ "magnus",
77
+ "rb-sys",
78
+ "rb-sys-env",
79
+ ]
80
+
81
+ [[package]]
82
+ name = "clang-sys"
83
+ version = "1.9.1"
84
+ source = "registry+https://github.com/rust-lang/crates.io-index"
85
+ checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a"
86
+ dependencies = [
87
+ "glob",
88
+ "libc",
89
+ "libloading",
90
+ ]
91
+
92
+ [[package]]
93
+ name = "crunchy"
94
+ version = "0.2.4"
95
+ source = "registry+https://github.com/rust-lang/crates.io-index"
96
+ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
97
+
98
+ [[package]]
99
+ name = "either"
100
+ version = "1.19.0"
101
+ source = "registry+https://github.com/rust-lang/crates.io-index"
102
+ checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be"
103
+
104
+ [[package]]
105
+ name = "glob"
106
+ version = "0.3.4"
107
+ source = "registry+https://github.com/rust-lang/crates.io-index"
108
+ checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b"
109
+
110
+ [[package]]
111
+ name = "half"
112
+ version = "2.7.1"
113
+ source = "registry+https://github.com/rust-lang/crates.io-index"
114
+ checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"
115
+ dependencies = [
116
+ "cfg-if",
117
+ "crunchy",
118
+ "zerocopy",
119
+ ]
120
+
121
+ [[package]]
122
+ name = "itertools"
123
+ version = "0.13.0"
124
+ source = "registry+https://github.com/rust-lang/crates.io-index"
125
+ checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
126
+ dependencies = [
127
+ "either",
128
+ ]
129
+
130
+ [[package]]
131
+ name = "lazy_static"
132
+ version = "1.5.1"
133
+ source = "registry+https://github.com/rust-lang/crates.io-index"
134
+ checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb"
135
+
136
+ [[package]]
137
+ name = "libc"
138
+ version = "0.2.191"
139
+ source = "registry+https://github.com/rust-lang/crates.io-index"
140
+ checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a"
141
+
142
+ [[package]]
143
+ name = "libloading"
144
+ version = "0.8.9"
145
+ source = "registry+https://github.com/rust-lang/crates.io-index"
146
+ checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
147
+ dependencies = [
148
+ "cfg-if",
149
+ "windows-link",
150
+ ]
151
+
152
+ [[package]]
153
+ name = "magnus"
154
+ version = "0.9.3"
155
+ source = "registry+https://github.com/rust-lang/crates.io-index"
156
+ checksum = "40ef424404d166cbb71c8b8d19c9c589c748c4547c1afa1928c5504299f6c713"
157
+ dependencies = [
158
+ "magnus-macros",
159
+ "rb-sys",
160
+ "rb-sys-env",
161
+ "seq-macro",
162
+ ]
163
+
164
+ [[package]]
165
+ name = "magnus-macros"
166
+ version = "0.9.1"
167
+ source = "registry+https://github.com/rust-lang/crates.io-index"
168
+ checksum = "9dafde2eeb66f090e0f326112323eb8324b12cb32b5d1210e541d3df6b0ce77e"
169
+ dependencies = [
170
+ "proc-macro2",
171
+ "quote",
172
+ "syn",
173
+ ]
174
+
175
+ [[package]]
176
+ name = "memchr"
177
+ version = "2.8.3"
178
+ source = "registry+https://github.com/rust-lang/crates.io-index"
179
+ checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
180
+
181
+ [[package]]
182
+ name = "minimal-lexical"
183
+ version = "0.2.1"
184
+ source = "registry+https://github.com/rust-lang/crates.io-index"
185
+ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
186
+
187
+ [[package]]
188
+ name = "nom"
189
+ version = "7.1.3"
190
+ source = "registry+https://github.com/rust-lang/crates.io-index"
191
+ checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
192
+ dependencies = [
193
+ "memchr",
194
+ "minimal-lexical",
195
+ ]
196
+
197
+ [[package]]
198
+ name = "proc-macro2"
199
+ version = "1.0.107"
200
+ source = "registry+https://github.com/rust-lang/crates.io-index"
201
+ checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
202
+ dependencies = [
203
+ "unicode-ident",
204
+ ]
205
+
206
+ [[package]]
207
+ name = "quote"
208
+ version = "1.0.47"
209
+ source = "registry+https://github.com/rust-lang/crates.io-index"
210
+ checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
211
+ dependencies = [
212
+ "proc-macro2",
213
+ ]
214
+
215
+ [[package]]
216
+ name = "rb-sys"
217
+ version = "0.9.130"
218
+ source = "registry+https://github.com/rust-lang/crates.io-index"
219
+ checksum = "02faf625bb10ba893e3ae620f19c9fb1b5f8fcae0fe4eb86bb3f2230fad75edb"
220
+ dependencies = [
221
+ "rb-sys-build",
222
+ ]
223
+
224
+ [[package]]
225
+ name = "rb-sys-build"
226
+ version = "0.9.130"
227
+ source = "registry+https://github.com/rust-lang/crates.io-index"
228
+ checksum = "05be6f9c86fe5482808162826f6c047d093b3670582296c770de1d94f8066694"
229
+ dependencies = [
230
+ "bindgen",
231
+ "lazy_static",
232
+ "proc-macro2",
233
+ "quote",
234
+ "regex",
235
+ "shell-words",
236
+ "syn",
237
+ ]
238
+
239
+ [[package]]
240
+ name = "rb-sys-env"
241
+ version = "0.2.3"
242
+ source = "registry+https://github.com/rust-lang/crates.io-index"
243
+ checksum = "cca7ad6a7e21e72151d56fe2495a259b5670e204c3adac41ee7ef676ea08117a"
244
+
245
+ [[package]]
246
+ name = "regex"
247
+ version = "1.13.1"
248
+ source = "registry+https://github.com/rust-lang/crates.io-index"
249
+ checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
250
+ dependencies = [
251
+ "aho-corasick",
252
+ "memchr",
253
+ "regex-automata",
254
+ "regex-syntax",
255
+ ]
256
+
257
+ [[package]]
258
+ name = "regex-automata"
259
+ version = "0.4.18"
260
+ source = "registry+https://github.com/rust-lang/crates.io-index"
261
+ checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
262
+ dependencies = [
263
+ "aho-corasick",
264
+ "memchr",
265
+ "regex-syntax",
266
+ ]
267
+
268
+ [[package]]
269
+ name = "regex-syntax"
270
+ version = "0.8.11"
271
+ source = "registry+https://github.com/rust-lang/crates.io-index"
272
+ checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
273
+
274
+ [[package]]
275
+ name = "rustc-hash"
276
+ version = "2.1.3"
277
+ source = "registry+https://github.com/rust-lang/crates.io-index"
278
+ checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
279
+
280
+ [[package]]
281
+ name = "seq-macro"
282
+ version = "0.3.6"
283
+ source = "registry+https://github.com/rust-lang/crates.io-index"
284
+ checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc"
285
+
286
+ [[package]]
287
+ name = "shell-words"
288
+ version = "1.1.1"
289
+ source = "registry+https://github.com/rust-lang/crates.io-index"
290
+ checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77"
291
+
292
+ [[package]]
293
+ name = "shlex"
294
+ version = "1.3.0"
295
+ source = "registry+https://github.com/rust-lang/crates.io-index"
296
+ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
297
+
298
+ [[package]]
299
+ name = "syn"
300
+ version = "2.0.119"
301
+ source = "registry+https://github.com/rust-lang/crates.io-index"
302
+ checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
303
+ dependencies = [
304
+ "proc-macro2",
305
+ "quote",
306
+ "unicode-ident",
307
+ ]
308
+
309
+ [[package]]
310
+ name = "unicode-ident"
311
+ version = "1.0.27"
312
+ source = "registry+https://github.com/rust-lang/crates.io-index"
313
+ checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563"
314
+
315
+ [[package]]
316
+ name = "windows-link"
317
+ version = "0.2.1"
318
+ source = "registry+https://github.com/rust-lang/crates.io-index"
319
+ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
320
+
321
+ [[package]]
322
+ name = "zerocopy"
323
+ version = "0.8.63"
324
+ source = "registry+https://github.com/rust-lang/crates.io-index"
325
+ checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8"
326
+ dependencies = [
327
+ "zerocopy-derive",
328
+ ]
329
+
330
+ [[package]]
331
+ name = "zerocopy-derive"
332
+ version = "0.8.63"
333
+ source = "registry+https://github.com/rust-lang/crates.io-index"
334
+ checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f"
335
+ dependencies = [
336
+ "proc-macro2",
337
+ "quote",
338
+ "syn",
339
+ ]