+15
.zed/settings.json
+15
.zed/settings.json
···
1
+
// Folder-specific settings
2
+
//
3
+
// For a full list of overridable settings, and general information on folder-specific settings,
4
+
// see the documentation: https://zed.dev/docs/configuring-zed#settings-files
5
+
{
6
+
"lsp": {
7
+
"rust-analyzer": {
8
+
"initialization_options": {
9
+
"rust": {
10
+
"analyzerTargetDir": true
11
+
}
12
+
}
13
+
}
14
+
}
15
+
}
+219
Cargo.lock
+219
Cargo.lock
···
3
3
version = 4
4
4
5
5
[[package]]
6
+
name = "aho-corasick"
7
+
version = "1.1.3"
8
+
source = "registry+https://github.com/rust-lang/crates.io-index"
9
+
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
10
+
dependencies = [
11
+
"memchr",
12
+
]
13
+
14
+
[[package]]
6
15
name = "anstream"
7
16
version = "0.6.20"
8
17
source = "registry+https://github.com/rust-lang/crates.io-index"
···
53
62
]
54
63
55
64
[[package]]
65
+
name = "base-x"
66
+
version = "0.2.11"
67
+
source = "registry+https://github.com/rust-lang/crates.io-index"
68
+
checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270"
69
+
70
+
[[package]]
71
+
name = "castaway"
72
+
version = "0.2.4"
73
+
source = "registry+https://github.com/rust-lang/crates.io-index"
74
+
checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
75
+
dependencies = [
76
+
"rustversion",
77
+
]
78
+
79
+
[[package]]
80
+
name = "cfg-if"
81
+
version = "1.0.3"
82
+
source = "registry+https://github.com/rust-lang/crates.io-index"
83
+
checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
84
+
85
+
[[package]]
86
+
name = "cid"
87
+
version = "0.11.1"
88
+
source = "registry+https://github.com/rust-lang/crates.io-index"
89
+
checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a"
90
+
dependencies = [
91
+
"core2",
92
+
"multibase",
93
+
"multihash",
94
+
"unsigned-varint",
95
+
]
96
+
97
+
[[package]]
56
98
name = "clap"
57
99
version = "4.5.48"
58
100
source = "registry+https://github.com/rust-lang/crates.io-index"
···
99
141
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
100
142
101
143
[[package]]
144
+
name = "compact_str"
145
+
version = "0.9.0"
146
+
source = "registry+https://github.com/rust-lang/crates.io-index"
147
+
checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a"
148
+
dependencies = [
149
+
"castaway",
150
+
"cfg-if",
151
+
"itoa",
152
+
"rustversion",
153
+
"ryu",
154
+
"static_assertions",
155
+
]
156
+
157
+
[[package]]
158
+
name = "core2"
159
+
version = "0.4.0"
160
+
source = "registry+https://github.com/rust-lang/crates.io-index"
161
+
checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505"
162
+
dependencies = [
163
+
"memchr",
164
+
]
165
+
166
+
[[package]]
167
+
name = "data-encoding"
168
+
version = "2.9.0"
169
+
source = "registry+https://github.com/rust-lang/crates.io-index"
170
+
checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476"
171
+
172
+
[[package]]
173
+
name = "data-encoding-macro"
174
+
version = "0.1.18"
175
+
source = "registry+https://github.com/rust-lang/crates.io-index"
176
+
checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d"
177
+
dependencies = [
178
+
"data-encoding",
179
+
"data-encoding-macro-internal",
180
+
]
181
+
182
+
[[package]]
183
+
name = "data-encoding-macro-internal"
184
+
version = "0.1.16"
185
+
source = "registry+https://github.com/rust-lang/crates.io-index"
186
+
checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976"
187
+
dependencies = [
188
+
"data-encoding",
189
+
"syn",
190
+
]
191
+
192
+
[[package]]
102
193
name = "heck"
103
194
version = "0.5.0"
104
195
source = "registry+https://github.com/rust-lang/crates.io-index"
···
109
200
version = "1.70.1"
110
201
source = "registry+https://github.com/rust-lang/crates.io-index"
111
202
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
203
+
204
+
[[package]]
205
+
name = "itoa"
206
+
version = "1.0.15"
207
+
source = "registry+https://github.com/rust-lang/crates.io-index"
208
+
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
112
209
113
210
[[package]]
114
211
name = "jacquard"
···
118
215
]
119
216
120
217
[[package]]
218
+
name = "jacquard-common"
219
+
version = "0.1.0"
220
+
dependencies = [
221
+
"cid",
222
+
"compact_str",
223
+
"multibase",
224
+
"multihash",
225
+
"regex",
226
+
"serde",
227
+
]
228
+
229
+
[[package]]
230
+
name = "memchr"
231
+
version = "2.7.6"
232
+
source = "registry+https://github.com/rust-lang/crates.io-index"
233
+
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
234
+
235
+
[[package]]
236
+
name = "multibase"
237
+
version = "0.9.1"
238
+
source = "registry+https://github.com/rust-lang/crates.io-index"
239
+
checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404"
240
+
dependencies = [
241
+
"base-x",
242
+
"data-encoding",
243
+
"data-encoding-macro",
244
+
]
245
+
246
+
[[package]]
247
+
name = "multihash"
248
+
version = "0.19.3"
249
+
source = "registry+https://github.com/rust-lang/crates.io-index"
250
+
checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d"
251
+
dependencies = [
252
+
"core2",
253
+
"unsigned-varint",
254
+
]
255
+
256
+
[[package]]
121
257
name = "once_cell_polyfill"
122
258
version = "1.70.1"
123
259
source = "registry+https://github.com/rust-lang/crates.io-index"
···
142
278
]
143
279
144
280
[[package]]
281
+
name = "regex"
282
+
version = "1.11.3"
283
+
source = "registry+https://github.com/rust-lang/crates.io-index"
284
+
checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c"
285
+
dependencies = [
286
+
"aho-corasick",
287
+
"memchr",
288
+
"regex-automata",
289
+
"regex-syntax",
290
+
]
291
+
292
+
[[package]]
293
+
name = "regex-automata"
294
+
version = "0.4.11"
295
+
source = "registry+https://github.com/rust-lang/crates.io-index"
296
+
checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad"
297
+
dependencies = [
298
+
"aho-corasick",
299
+
"memchr",
300
+
"regex-syntax",
301
+
]
302
+
303
+
[[package]]
304
+
name = "regex-syntax"
305
+
version = "0.8.6"
306
+
source = "registry+https://github.com/rust-lang/crates.io-index"
307
+
checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
308
+
309
+
[[package]]
310
+
name = "rustversion"
311
+
version = "1.0.22"
312
+
source = "registry+https://github.com/rust-lang/crates.io-index"
313
+
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
314
+
315
+
[[package]]
316
+
name = "ryu"
317
+
version = "1.0.20"
318
+
source = "registry+https://github.com/rust-lang/crates.io-index"
319
+
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
320
+
321
+
[[package]]
322
+
name = "serde"
323
+
version = "1.0.227"
324
+
source = "registry+https://github.com/rust-lang/crates.io-index"
325
+
checksum = "80ece43fc6fbed4eb5392ab50c07334d3e577cbf40997ee896fe7af40bba4245"
326
+
dependencies = [
327
+
"serde_core",
328
+
"serde_derive",
329
+
]
330
+
331
+
[[package]]
332
+
name = "serde_core"
333
+
version = "1.0.227"
334
+
source = "registry+https://github.com/rust-lang/crates.io-index"
335
+
checksum = "7a576275b607a2c86ea29e410193df32bc680303c82f31e275bbfcafe8b33be5"
336
+
dependencies = [
337
+
"serde_derive",
338
+
]
339
+
340
+
[[package]]
341
+
name = "serde_derive"
342
+
version = "1.0.227"
343
+
source = "registry+https://github.com/rust-lang/crates.io-index"
344
+
checksum = "51e694923b8824cf0e9b382adf0f60d4e05f348f357b38833a3fa5ed7c2ede04"
345
+
dependencies = [
346
+
"proc-macro2",
347
+
"quote",
348
+
"syn",
349
+
]
350
+
351
+
[[package]]
352
+
name = "static_assertions"
353
+
version = "1.1.0"
354
+
source = "registry+https://github.com/rust-lang/crates.io-index"
355
+
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
356
+
357
+
[[package]]
145
358
name = "strsim"
146
359
version = "0.11.1"
147
360
source = "registry+https://github.com/rust-lang/crates.io-index"
···
163
376
version = "1.0.19"
164
377
source = "registry+https://github.com/rust-lang/crates.io-index"
165
378
checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d"
379
+
380
+
[[package]]
381
+
name = "unsigned-varint"
382
+
version = "0.8.0"
383
+
source = "registry+https://github.com/rust-lang/crates.io-index"
384
+
checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06"
166
385
167
386
[[package]]
168
387
name = "utf8parse"
+4
-2
Cargo.toml
+4
-2
Cargo.toml
···
4
4
5
5
6
6
[workspace.package]
7
-
authors = ["Orual <orual@nonbinary.computer>"]
8
7
edition = "2024"
9
-
description = "A simple Rust project using Nix"
10
8
version = "0.1.0"
9
+
authors = ["Orual <orual@nonbinary.computer>"]
10
+
11
+
description = "A simple Rust project using Nix"
12
+
11
13
12
14
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
13
15
+14
crates/jacquard-common/Cargo.toml
+14
crates/jacquard-common/Cargo.toml
···
1
+
[package]
2
+
name = "jacquard-common"
3
+
edition.workspace = true
4
+
version.workspace = true
5
+
authors.workspace = true
6
+
description.workspace = true
7
+
8
+
[dependencies]
9
+
cid = "0.11.1"
10
+
compact_str = "0.9.0"
11
+
multibase = "0.9.1"
12
+
multihash = "0.19.3"
13
+
regex = "1.11.3"
14
+
serde = { version = "1.0.227", features = ["derive"] }
crates/jacquard-common/src/aturi.rs
crates/jacquard-common/src/aturi.rs
This is a binary file and will not be displayed.
+5
crates/jacquard-common/src/blob.rs
+5
crates/jacquard-common/src/blob.rs
+20
crates/jacquard-common/src/cid.rs
+20
crates/jacquard-common/src/cid.rs
···
1
+
use serde::{Deserialize, Serialize};
2
+
use std::str::
3
+
4
+
pub use cid::Cid as IpldCid;
5
+
6
+
/// raw
7
+
pub const ATP_CID_CODEC: u64 = 0x55;
8
+
9
+
/// SHA-256
10
+
pub const ATP_CID_HASH: u64 = 0x12;
11
+
12
+
/// base 32
13
+
pub const ATP_CID_BASE: multibase::Base = multibase::Base::Base32;
14
+
15
+
#[derive(Serialize, Deserialize, Debug, Clone)]
16
+
#[serde(untagged)]
17
+
pub enum Cid {
18
+
Cid(IpldCid),
19
+
CidStr(CowStr<'static>),
20
+
}
+285
crates/jacquard-common/src/cowstr.rs
+285
crates/jacquard-common/src/cowstr.rs
···
1
+
use std::{
2
+
borrow::Cow,
3
+
fmt,
4
+
hash::{Hash, Hasher},
5
+
ops::Deref,
6
+
};
7
+
8
+
use compact_str::CompactString;
9
+
10
+
use crate::IntoStatic;
11
+
12
+
/// Shamelessly copied from https://github.com/bearcove/merde
13
+
/// A copy-on-write string type that uses [`CompactString`] for
14
+
/// the "owned" variant.
15
+
///
16
+
/// The standard [`Cow`] type cannot be used, since
17
+
/// `<str as ToOwned>::Owned` is `String`, and not `CompactString`.
18
+
#[derive(Clone)]
19
+
pub enum CowStr<'s> {
20
+
Borrowed(&'s str),
21
+
Owned(CompactString),
22
+
}
23
+
24
+
impl CowStr<'static> {
25
+
/// Create a new `CowStr` by copying from a `&str` — this might allocate
26
+
/// if the `compact_str` feature is disabled, or if the string is longer
27
+
/// than `MAX_INLINE_SIZE`.
28
+
pub fn copy_from_str(s: &str) -> Self {
29
+
Self::Owned(CompactString::from(s))
30
+
}
31
+
}
32
+
33
+
impl<'s> CowStr<'s> {
34
+
#[inline]
35
+
pub fn from_utf8(s: &'s [u8]) -> Result<Self, std::str::Utf8Error> {
36
+
Ok(Self::Borrowed(std::str::from_utf8(s)?))
37
+
}
38
+
39
+
#[inline]
40
+
pub fn from_utf8_owned(s: Vec<u8>) -> Result<Self, std::str::Utf8Error> {
41
+
Ok(Self::Owned(CompactString::from_utf8(s)?))
42
+
}
43
+
44
+
#[inline]
45
+
pub fn from_utf8_lossy(s: &'s [u8]) -> Self {
46
+
Self::Owned(CompactString::from_utf8_lossy(s))
47
+
}
48
+
49
+
/// # Safety
50
+
///
51
+
/// This function is unsafe because it does not check that the bytes are valid UTF-8.
52
+
#[inline]
53
+
pub unsafe fn from_utf8_unchecked(s: &'s [u8]) -> Self {
54
+
unsafe { Self::Owned(CompactString::from_utf8_unchecked(s)) }
55
+
}
56
+
}
57
+
58
+
impl AsRef<str> for CowStr<'_> {
59
+
#[inline]
60
+
fn as_ref(&self) -> &str {
61
+
match self {
62
+
CowStr::Borrowed(s) => s,
63
+
CowStr::Owned(s) => s.as_str(),
64
+
}
65
+
}
66
+
}
67
+
68
+
impl Deref for CowStr<'_> {
69
+
type Target = str;
70
+
71
+
#[inline]
72
+
fn deref(&self) -> &Self::Target {
73
+
match self {
74
+
CowStr::Borrowed(s) => s,
75
+
CowStr::Owned(s) => s.as_str(),
76
+
}
77
+
}
78
+
}
79
+
80
+
impl<'a> From<Cow<'a, str>> for CowStr<'a> {
81
+
#[inline]
82
+
fn from(s: Cow<'a, str>) -> Self {
83
+
match s {
84
+
Cow::Borrowed(s) => CowStr::Borrowed(s),
85
+
#[allow(clippy::useless_conversion)]
86
+
Cow::Owned(s) => CowStr::Owned(s.into()),
87
+
}
88
+
}
89
+
}
90
+
91
+
impl<'s> From<&'s str> for CowStr<'s> {
92
+
#[inline]
93
+
fn from(s: &'s str) -> Self {
94
+
CowStr::Borrowed(s)
95
+
}
96
+
}
97
+
98
+
impl From<String> for CowStr<'_> {
99
+
#[inline]
100
+
fn from(s: String) -> Self {
101
+
#[allow(clippy::useless_conversion)]
102
+
CowStr::Owned(s.into())
103
+
}
104
+
}
105
+
106
+
impl From<Box<str>> for CowStr<'_> {
107
+
#[inline]
108
+
fn from(s: Box<str>) -> Self {
109
+
CowStr::Owned(s.into())
110
+
}
111
+
}
112
+
113
+
impl<'s> From<&'s String> for CowStr<'s> {
114
+
#[inline]
115
+
fn from(s: &'s String) -> Self {
116
+
CowStr::Borrowed(s.as_str())
117
+
}
118
+
}
119
+
120
+
impl From<CowStr<'_>> for String {
121
+
#[inline]
122
+
fn from(s: CowStr<'_>) -> Self {
123
+
match s {
124
+
CowStr::Borrowed(s) => s.into(),
125
+
#[allow(clippy::useless_conversion)]
126
+
CowStr::Owned(s) => s.into(),
127
+
}
128
+
}
129
+
}
130
+
131
+
impl From<CowStr<'_>> for Box<str> {
132
+
#[inline]
133
+
fn from(s: CowStr<'_>) -> Self {
134
+
match s {
135
+
CowStr::Borrowed(s) => s.into(),
136
+
CowStr::Owned(s) => s.into(),
137
+
}
138
+
}
139
+
}
140
+
141
+
impl<'a> PartialEq<CowStr<'a>> for CowStr<'_> {
142
+
#[inline]
143
+
fn eq(&self, other: &CowStr<'a>) -> bool {
144
+
self.deref() == other.deref()
145
+
}
146
+
}
147
+
148
+
impl PartialEq<&str> for CowStr<'_> {
149
+
#[inline]
150
+
fn eq(&self, other: &&str) -> bool {
151
+
self.deref() == *other
152
+
}
153
+
}
154
+
155
+
impl PartialEq<CowStr<'_>> for &str {
156
+
#[inline]
157
+
fn eq(&self, other: &CowStr<'_>) -> bool {
158
+
*self == other.deref()
159
+
}
160
+
}
161
+
162
+
impl PartialEq<String> for CowStr<'_> {
163
+
#[inline]
164
+
fn eq(&self, other: &String) -> bool {
165
+
self.deref() == other.as_str()
166
+
}
167
+
}
168
+
169
+
impl PartialEq<CowStr<'_>> for String {
170
+
#[inline]
171
+
fn eq(&self, other: &CowStr<'_>) -> bool {
172
+
self.as_str() == other.deref()
173
+
}
174
+
}
175
+
176
+
impl Eq for CowStr<'_> {}
177
+
178
+
impl Hash for CowStr<'_> {
179
+
#[inline]
180
+
fn hash<H: Hasher>(&self, state: &mut H) {
181
+
self.deref().hash(state)
182
+
}
183
+
}
184
+
185
+
impl fmt::Debug for CowStr<'_> {
186
+
#[inline]
187
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
188
+
self.deref().fmt(f)
189
+
}
190
+
}
191
+
192
+
impl fmt::Display for CowStr<'_> {
193
+
#[inline]
194
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
195
+
self.deref().fmt(f)
196
+
}
197
+
}
198
+
199
+
impl IntoStatic for CowStr<'_> {
200
+
type Output = CowStr<'static>;
201
+
202
+
#[inline]
203
+
fn into_static(self) -> Self::Output {
204
+
match self {
205
+
CowStr::Borrowed(s) => CowStr::Owned((*s).into()),
206
+
CowStr::Owned(s) => CowStr::Owned(s),
207
+
}
208
+
}
209
+
}
210
+
211
+
use serde::{Deserialize, Serialize};
212
+
213
+
impl Serialize for CowStr<'_> {
214
+
#[inline]
215
+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
216
+
where
217
+
S: serde::Serializer,
218
+
{
219
+
serializer.serialize_str(self)
220
+
}
221
+
}
222
+
223
+
impl<'de: 'a, 'a> Deserialize<'de> for CowStr<'a> {
224
+
#[inline]
225
+
fn deserialize<D>(deserializer: D) -> Result<CowStr<'a>, D::Error>
226
+
where
227
+
D: serde::Deserializer<'de>,
228
+
{
229
+
struct CowStrVisitor;
230
+
231
+
impl<'de> serde::de::Visitor<'de> for CowStrVisitor {
232
+
type Value = CowStr<'de>;
233
+
234
+
#[inline]
235
+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
236
+
write!(formatter, "a string")
237
+
}
238
+
239
+
#[inline]
240
+
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
241
+
where
242
+
E: serde::de::Error,
243
+
{
244
+
Ok(CowStr::copy_from_str(v))
245
+
}
246
+
247
+
#[inline]
248
+
fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
249
+
where
250
+
E: serde::de::Error,
251
+
{
252
+
Ok(CowStr::Borrowed(v))
253
+
}
254
+
255
+
#[inline]
256
+
fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
257
+
where
258
+
E: serde::de::Error,
259
+
{
260
+
Ok(v.into())
261
+
}
262
+
}
263
+
264
+
deserializer.deserialize_str(CowStrVisitor)
265
+
}
266
+
}
267
+
268
+
#[cfg(test)]
269
+
mod tests {
270
+
use super::*;
271
+
272
+
#[test]
273
+
fn test_partialeq_with_str() {
274
+
let cow_str1 = CowStr::Borrowed("hello");
275
+
let cow_str2 = CowStr::Borrowed("hello");
276
+
let cow_str3 = CowStr::Borrowed("world");
277
+
278
+
assert_eq!(cow_str1, "hello");
279
+
assert_eq!("hello", cow_str1);
280
+
assert_eq!(cow_str1, cow_str2);
281
+
assert_ne!(cow_str1, "world");
282
+
assert_ne!("world", cow_str1);
283
+
assert_ne!(cow_str1, cow_str3);
284
+
}
285
+
}
+3
crates/jacquard-common/src/did.rs
+3
crates/jacquard-common/src/did.rs
crates/jacquard-common/src/handle.rs
crates/jacquard-common/src/handle.rs
This is a binary file and will not be displayed.
+291
crates/jacquard-common/src/into_static.rs
+291
crates/jacquard-common/src/into_static.rs
···
1
+
use std::borrow::Cow;
2
+
use std::collections::HashMap;
3
+
use std::collections::HashSet;
4
+
use std::collections::VecDeque;
5
+
use std::hash::BuildHasher;
6
+
use std::hash::Hash;
7
+
use std::sync::Arc;
8
+
9
+
/// Shamelessly copied from https://github.com/bearcove/merde
10
+
/// Allow turning a value into an "owned" variant, which can then be
11
+
/// returned, moved, etc.
12
+
///
13
+
/// This usually involves allocating buffers for `Cow<'a, str>`, etc.
14
+
pub trait IntoStatic: Sized {
15
+
/// The "owned" variant of the type. For `Cow<'a, str>`, this is `Cow<'static, str>`, for example.
16
+
type Output: 'static;
17
+
18
+
/// Turns the value into an "owned" variant, which can then be returned, moved, etc.
19
+
///
20
+
/// This allocates, for all but the most trivial types.
21
+
fn into_static(self) -> Self::Output;
22
+
}
23
+
24
+
impl<T, E> IntoStatic for Result<T, E>
25
+
where
26
+
T: IntoStatic,
27
+
E: IntoStatic,
28
+
{
29
+
type Output = Result<T::Output, E::Output>;
30
+
31
+
fn into_static(self) -> Self::Output {
32
+
match self {
33
+
Ok(v) => Ok(v.into_static()),
34
+
Err(e) => Err(e.into_static()),
35
+
}
36
+
}
37
+
}
38
+
39
+
impl<T> IntoStatic for Cow<'_, T>
40
+
where
41
+
T: ToOwned + ?Sized + 'static,
42
+
{
43
+
type Output = Cow<'static, T>;
44
+
45
+
#[inline(always)]
46
+
fn into_static(self) -> Self::Output {
47
+
match self {
48
+
Cow::Borrowed(b) => Cow::Owned(b.to_owned()),
49
+
Cow::Owned(o) => Cow::Owned(o),
50
+
}
51
+
}
52
+
}
53
+
54
+
macro_rules! impl_into_static_passthru {
55
+
($($ty:ty),+) => {
56
+
$(
57
+
impl IntoStatic for $ty {
58
+
type Output = $ty;
59
+
60
+
#[inline(always)]
61
+
fn into_static(self) -> Self::Output {
62
+
self
63
+
}
64
+
}
65
+
)+
66
+
};
67
+
}
68
+
69
+
impl_into_static_passthru!(
70
+
String, u128, u64, u32, u16, u8, i128, i64, i32, i16, i8, bool, char, usize, isize, f32, f64
71
+
);
72
+
73
+
impl<T: IntoStatic> IntoStatic for Box<T> {
74
+
type Output = Box<T::Output>;
75
+
76
+
fn into_static(self) -> Self::Output {
77
+
Box::new((*self).into_static())
78
+
}
79
+
}
80
+
81
+
impl<T: IntoStatic> IntoStatic for Option<T> {
82
+
type Output = Option<T::Output>;
83
+
84
+
fn into_static(self) -> Self::Output {
85
+
self.map(|v| v.into_static())
86
+
}
87
+
}
88
+
89
+
impl<T: IntoStatic> IntoStatic for Vec<T> {
90
+
type Output = Vec<T::Output>;
91
+
92
+
fn into_static(self) -> Self::Output {
93
+
self.into_iter().map(|v| v.into_static()).collect()
94
+
}
95
+
}
96
+
97
+
impl<T: IntoStatic + Clone> IntoStatic for Arc<T> {
98
+
type Output = Arc<T::Output>;
99
+
100
+
fn into_static(self) -> Self::Output {
101
+
let t: T = (*self).clone();
102
+
Arc::new(t.into_static())
103
+
}
104
+
}
105
+
106
+
impl<K, V, S> IntoStatic for HashMap<K, V, S>
107
+
where
108
+
S: BuildHasher + Default + 'static,
109
+
K: IntoStatic + Eq + Hash,
110
+
V: IntoStatic,
111
+
K::Output: Eq + Hash,
112
+
{
113
+
type Output = HashMap<K::Output, V::Output, S>;
114
+
115
+
fn into_static(self) -> Self::Output {
116
+
self.into_iter()
117
+
.map(|(k, v)| (k.into_static(), v.into_static()))
118
+
.collect()
119
+
}
120
+
}
121
+
122
+
impl<T: IntoStatic> IntoStatic for HashSet<T>
123
+
where
124
+
T::Output: Eq + Hash,
125
+
{
126
+
type Output = HashSet<T::Output>;
127
+
128
+
fn into_static(self) -> Self::Output {
129
+
self.into_iter().map(|v| v.into_static()).collect()
130
+
}
131
+
}
132
+
133
+
impl<T: IntoStatic> IntoStatic for VecDeque<T> {
134
+
type Output = VecDeque<T::Output>;
135
+
136
+
fn into_static(self) -> Self::Output {
137
+
self.into_iter().map(|v| v.into_static()).collect()
138
+
}
139
+
}
140
+
141
+
impl<T1: IntoStatic> IntoStatic for (T1,) {
142
+
type Output = (T1::Output,);
143
+
144
+
fn into_static(self) -> Self::Output {
145
+
(self.0.into_static(),)
146
+
}
147
+
}
148
+
149
+
impl<T1: IntoStatic, T2: IntoStatic> IntoStatic for (T1, T2) {
150
+
type Output = (T1::Output, T2::Output);
151
+
152
+
fn into_static(self) -> Self::Output {
153
+
(self.0.into_static(), self.1.into_static())
154
+
}
155
+
}
156
+
157
+
impl<T1: IntoStatic, T2: IntoStatic, T3: IntoStatic> IntoStatic for (T1, T2, T3) {
158
+
type Output = (T1::Output, T2::Output, T3::Output);
159
+
160
+
fn into_static(self) -> Self::Output {
161
+
(
162
+
self.0.into_static(),
163
+
self.1.into_static(),
164
+
self.2.into_static(),
165
+
)
166
+
}
167
+
}
168
+
169
+
impl<T1: IntoStatic, T2: IntoStatic, T3: IntoStatic, T4: IntoStatic> IntoStatic
170
+
for (T1, T2, T3, T4)
171
+
{
172
+
type Output = (T1::Output, T2::Output, T3::Output, T4::Output);
173
+
174
+
fn into_static(self) -> Self::Output {
175
+
(
176
+
self.0.into_static(),
177
+
self.1.into_static(),
178
+
self.2.into_static(),
179
+
self.3.into_static(),
180
+
)
181
+
}
182
+
}
183
+
184
+
impl<T1: IntoStatic, T2: IntoStatic, T3: IntoStatic, T4: IntoStatic, T5: IntoStatic> IntoStatic
185
+
for (T1, T2, T3, T4, T5)
186
+
{
187
+
type Output = (T1::Output, T2::Output, T3::Output, T4::Output, T5::Output);
188
+
189
+
fn into_static(self) -> Self::Output {
190
+
(
191
+
self.0.into_static(),
192
+
self.1.into_static(),
193
+
self.2.into_static(),
194
+
self.3.into_static(),
195
+
self.4.into_static(),
196
+
)
197
+
}
198
+
}
199
+
200
+
impl<T1: IntoStatic, T2: IntoStatic, T3: IntoStatic, T4: IntoStatic, T5: IntoStatic, T6: IntoStatic>
201
+
IntoStatic for (T1, T2, T3, T4, T5, T6)
202
+
{
203
+
type Output = (
204
+
T1::Output,
205
+
T2::Output,
206
+
T3::Output,
207
+
T4::Output,
208
+
T5::Output,
209
+
T6::Output,
210
+
);
211
+
212
+
fn into_static(self) -> Self::Output {
213
+
(
214
+
self.0.into_static(),
215
+
self.1.into_static(),
216
+
self.2.into_static(),
217
+
self.3.into_static(),
218
+
self.4.into_static(),
219
+
self.5.into_static(),
220
+
)
221
+
}
222
+
}
223
+
224
+
impl<
225
+
T1: IntoStatic,
226
+
T2: IntoStatic,
227
+
T3: IntoStatic,
228
+
T4: IntoStatic,
229
+
T5: IntoStatic,
230
+
T6: IntoStatic,
231
+
T7: IntoStatic,
232
+
> IntoStatic for (T1, T2, T3, T4, T5, T6, T7)
233
+
{
234
+
type Output = (
235
+
T1::Output,
236
+
T2::Output,
237
+
T3::Output,
238
+
T4::Output,
239
+
T5::Output,
240
+
T6::Output,
241
+
T7::Output,
242
+
);
243
+
244
+
fn into_static(self) -> Self::Output {
245
+
(
246
+
self.0.into_static(),
247
+
self.1.into_static(),
248
+
self.2.into_static(),
249
+
self.3.into_static(),
250
+
self.4.into_static(),
251
+
self.5.into_static(),
252
+
self.6.into_static(),
253
+
)
254
+
}
255
+
}
256
+
257
+
impl<
258
+
T1: IntoStatic,
259
+
T2: IntoStatic,
260
+
T3: IntoStatic,
261
+
T4: IntoStatic,
262
+
T5: IntoStatic,
263
+
T6: IntoStatic,
264
+
T7: IntoStatic,
265
+
T8: IntoStatic,
266
+
> IntoStatic for (T1, T2, T3, T4, T5, T6, T7, T8)
267
+
{
268
+
type Output = (
269
+
T1::Output,
270
+
T2::Output,
271
+
T3::Output,
272
+
T4::Output,
273
+
T5::Output,
274
+
T6::Output,
275
+
T7::Output,
276
+
T8::Output,
277
+
);
278
+
279
+
fn into_static(self) -> Self::Output {
280
+
(
281
+
self.0.into_static(),
282
+
self.1.into_static(),
283
+
self.2.into_static(),
284
+
self.3.into_static(),
285
+
self.4.into_static(),
286
+
self.5.into_static(),
287
+
self.6.into_static(),
288
+
self.7.into_static(),
289
+
)
290
+
}
291
+
}
+10
crates/jacquard-common/src/lib.rs
+10
crates/jacquard-common/src/lib.rs
+1
crates/jacquard-common/src/link.rs
+1
crates/jacquard-common/src/link.rs
···
1
+
// strongref, blobref(s), cid links
crates/jacquard-common/src/nsid.rs
crates/jacquard-common/src/nsid.rs
This is a binary file and will not be displayed.
+1
crates/jacquard/Cargo.toml
+1
crates/jacquard/Cargo.toml
+21
-21
flake.lock
+21
-21
flake.lock
···
17
17
},
18
18
"crane": {
19
19
"locked": {
20
-
"lastModified": 1736566337,
21
-
"narHash": "sha256-SC0eDcZPqISVt6R0UfGPyQLrI0+BppjjtQ3wcSlk0oI=",
20
+
"lastModified": 1757183466,
21
+
"narHash": "sha256-kTdCCMuRE+/HNHES5JYsbRHmgtr+l9mOtf5dpcMppVc=",
22
22
"owner": "ipetkov",
23
23
"repo": "crane",
24
-
"rev": "9172acc1ee6c7e1cbafc3044ff850c568c75a5a3",
24
+
"rev": "d599ae4847e7f87603e7082d73ca673aa93c916d",
25
25
"type": "github"
26
26
},
27
27
"original": {
···
37
37
]
38
38
},
39
39
"locked": {
40
-
"lastModified": 1725234343,
41
-
"narHash": "sha256-+ebgonl3NbiKD2UD0x4BszCZQ6sTfL4xioaM49o5B3Y=",
40
+
"lastModified": 1756770412,
41
+
"narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=",
42
42
"owner": "hercules-ci",
43
43
"repo": "flake-parts",
44
-
"rev": "567b938d64d4b4112ee253b9274472dc3a346eb6",
44
+
"rev": "4524271976b625a4a605beefd893f270620fd751",
45
45
"type": "github"
46
46
},
47
47
"original": {
···
53
53
"git-hooks": {
54
54
"flake": false,
55
55
"locked": {
56
-
"lastModified": 1734425854,
57
-
"narHash": "sha256-nzE5UbJ41aPEKf8R2ZFYtLkqPmF7EIUbNEdHMBLg0Ig=",
56
+
"lastModified": 1758108966,
57
+
"narHash": "sha256-ytw7ROXaWZ7OfwHrQ9xvjpUWeGVm86pwnEd1QhzawIo=",
58
58
"owner": "cachix",
59
59
"repo": "git-hooks.nix",
60
-
"rev": "0ddd26d0925f618c3a5d85a4fa5eb1e23a09491d",
60
+
"rev": "54df955a695a84cd47d4a43e08e1feaf90b1fd9b",
61
61
"type": "github"
62
62
},
63
63
"original": {
···
68
68
},
69
69
"nixpkgs": {
70
70
"locked": {
71
-
"lastModified": 1736693123,
72
-
"narHash": "sha256-9lIfXCaBPwUA7FnfDnoH4gxxdOvXG78k6UlUw0+ZDxc=",
71
+
"lastModified": 1758763312,
72
+
"narHash": "sha256-puBMviZhYlqOdUUgEmMVJpXqC/ToEqSvkyZ30qQ09xM=",
73
73
"owner": "nixos",
74
74
"repo": "nixpkgs",
75
-
"rev": "2fdec2c2e68b7b7845d1ea4e0894c63143e3261b",
75
+
"rev": "e57b3b16ad8758fd681511a078f35c416a8cc939",
76
76
"type": "github"
77
77
},
78
78
"original": {
···
84
84
},
85
85
"process-compose-flake": {
86
86
"locked": {
87
-
"lastModified": 1724606023,
88
-
"narHash": "sha256-rdGeNa/lCS8E1lXzPqgl+vZUUvnbEZT11Bqkx5jfYug=",
87
+
"lastModified": 1758658658,
88
+
"narHash": "sha256-y5GSCqlGe/uZzlocCPZcjc7Gj+mTq7m0P6xPGx88+No=",
89
89
"owner": "Platonic-Systems",
90
90
"repo": "process-compose-flake",
91
-
"rev": "f6ce9481df9aec739e4e06b67492401a5bb4f0b1",
91
+
"rev": "e968a94633788f5d9595d727f41c2baf0714be7b",
92
92
"type": "github"
93
93
},
94
94
"original": {
···
117
117
"rust-overlay": "rust-overlay"
118
118
},
119
119
"locked": {
120
-
"lastModified": 1736806612,
121
-
"narHash": "sha256-WioA+Vk7suDK+Ek77rDlbuxV6WqwFt30JsKHrmDCSiU=",
120
+
"lastModified": 1757862855,
121
+
"narHash": "sha256-XPqlAQkx8rvG89nw+SbU6TiGVYPWdYIklPljdAyjp7w=",
122
122
"owner": "juspay",
123
123
"repo": "rust-flake",
124
-
"rev": "b5f39885e2fcf137bfaf75decc077f9cca2bd984",
124
+
"rev": "fa28d6e30b5d13014f24354dc49e717733fbb995",
125
125
"type": "github"
126
126
},
127
127
"original": {
···
138
138
]
139
139
},
140
140
"locked": {
141
-
"lastModified": 1736700680,
142
-
"narHash": "sha256-9gmWIb8xsycWHEYpd2SiVIAZnUULX6Y+IMMZBcDUCQU=",
141
+
"lastModified": 1757730403,
142
+
"narHash": "sha256-Jxl4OZRVsXs8JxEHUVQn3oPu6zcqFyGGKaFrlNgbzp0=",
143
143
"owner": "oxalica",
144
144
"repo": "rust-overlay",
145
-
"rev": "5d1865c0da63b4c949f383d982b6b43519946e8f",
145
+
"rev": "3232f7f8bd07849fc6f4ae77fe695e0abb2eba2c",
146
146
"type": "github"
147
147
},
148
148
"original": {
+11
nix/modules/rust.nix
+11
nix/modules/rust.nix
···
46
46
};
47
47
};
48
48
};
49
+
50
+
"jacquard-common" = {
51
+
imports = [globalCrateConfig];
52
+
autoWire = ["crate" "clippy"];
53
+
path = ./../../crates/jacquard-common;
54
+
crane = {
55
+
args = {
56
+
buildInputs = commonBuildInputs;
57
+
};
58
+
};
59
+
};
49
60
};
50
61
};
51
62
packages.default = self'.packages.jacquard;