├── .cargo └── config.toml ├── .dockerignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── META.json ├── README.md ├── docker-compose.yaml ├── dockerfiles └── db │ └── Dockerfile ├── pg_jsonschema.control └── src ├── bin └── pgrx_embed.rs └── lib.rs /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | # Postgres symbols won't be available until runtime 3 | rustflags = ["-C", "link-args=-Wl,-undefined,dynamic_lookup"] 4 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .benchmarks 2 | .git/ 3 | .github/ 4 | dockerfiles/ 5 | .gitignore 6 | *.md 7 | *.yaml 8 | *.yml 9 | LICENSE 10 | target/ 11 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "ahash" 22 | version = "0.8.11" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 25 | dependencies = [ 26 | "cfg-if", 27 | "getrandom 0.2.15", 28 | "once_cell", 29 | "serde", 30 | "version_check", 31 | "zerocopy 0.7.35", 32 | ] 33 | 34 | [[package]] 35 | name = "aho-corasick" 36 | version = "1.1.3" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 39 | dependencies = [ 40 | "memchr", 41 | ] 42 | 43 | [[package]] 44 | name = "annotate-snippets" 45 | version = "0.9.2" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" 48 | dependencies = [ 49 | "unicode-width", 50 | "yansi-term", 51 | ] 52 | 53 | [[package]] 54 | name = "anstyle" 55 | version = "1.0.10" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 58 | 59 | [[package]] 60 | name = "anyhow" 61 | version = "1.0.95" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" 64 | 65 | [[package]] 66 | name = "async-trait" 67 | version = "0.1.86" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" 70 | dependencies = [ 71 | "proc-macro2", 72 | "quote", 73 | "syn", 74 | ] 75 | 76 | [[package]] 77 | name = "atomic-traits" 78 | version = "0.3.0" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "b29ec3788e96fb4fdb275ccb9d62811f2fa903d76c5eb4dd6fe7d09a7ed5871f" 81 | dependencies = [ 82 | "cfg-if", 83 | "rustc_version", 84 | ] 85 | 86 | [[package]] 87 | name = "autocfg" 88 | version = "1.4.0" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 91 | 92 | [[package]] 93 | name = "backtrace" 94 | version = "0.3.74" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 97 | dependencies = [ 98 | "addr2line", 99 | "cfg-if", 100 | "libc", 101 | "miniz_oxide", 102 | "object", 103 | "rustc-demangle", 104 | "windows-targets", 105 | ] 106 | 107 | [[package]] 108 | name = "base64" 109 | version = "0.22.1" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 112 | 113 | [[package]] 114 | name = "bindgen" 115 | version = "0.70.1" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" 118 | dependencies = [ 119 | "annotate-snippets", 120 | "bitflags", 121 | "cexpr", 122 | "clang-sys", 123 | "itertools", 124 | "proc-macro2", 125 | "quote", 126 | "regex", 127 | "rustc-hash", 128 | "shlex", 129 | "syn", 130 | ] 131 | 132 | [[package]] 133 | name = "bit-set" 134 | version = "0.8.0" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 137 | dependencies = [ 138 | "bit-vec", 139 | ] 140 | 141 | [[package]] 142 | name = "bit-vec" 143 | version = "0.8.0" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 146 | 147 | [[package]] 148 | name = "bitflags" 149 | version = "2.8.0" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 152 | 153 | [[package]] 154 | name = "bitvec" 155 | version = "1.0.1" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" 158 | dependencies = [ 159 | "funty", 160 | "radium", 161 | "tap", 162 | "wyz", 163 | ] 164 | 165 | [[package]] 166 | name = "block-buffer" 167 | version = "0.10.4" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 170 | dependencies = [ 171 | "generic-array", 172 | ] 173 | 174 | [[package]] 175 | name = "borrow-or-share" 176 | version = "0.2.2" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "3eeab4423108c5d7c744f4d234de88d18d636100093ae04caf4825134b9c3a32" 179 | 180 | [[package]] 181 | name = "bumpalo" 182 | version = "3.17.0" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 185 | 186 | [[package]] 187 | name = "bytecount" 188 | version = "0.6.8" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" 191 | 192 | [[package]] 193 | name = "byteorder" 194 | version = "1.5.0" 195 | source = "registry+https://github.com/rust-lang/crates.io-index" 196 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 197 | 198 | [[package]] 199 | name = "bytes" 200 | version = "1.10.0" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" 203 | 204 | [[package]] 205 | name = "camino" 206 | version = "1.1.9" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" 209 | dependencies = [ 210 | "serde", 211 | ] 212 | 213 | [[package]] 214 | name = "cargo-platform" 215 | version = "0.1.9" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" 218 | dependencies = [ 219 | "serde", 220 | ] 221 | 222 | [[package]] 223 | name = "cargo_metadata" 224 | version = "0.18.1" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" 227 | dependencies = [ 228 | "camino", 229 | "cargo-platform", 230 | "semver 1.0.25", 231 | "serde", 232 | "serde_json", 233 | "thiserror 1.0.69", 234 | ] 235 | 236 | [[package]] 237 | name = "cargo_toml" 238 | version = "0.19.2" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" 241 | dependencies = [ 242 | "serde", 243 | "toml", 244 | ] 245 | 246 | [[package]] 247 | name = "cc" 248 | version = "1.2.11" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "e4730490333d58093109dc02c23174c3f4d490998c3fed3cc8e82d57afedb9cf" 251 | dependencies = [ 252 | "shlex", 253 | ] 254 | 255 | [[package]] 256 | name = "cee-scape" 257 | version = "0.2.0" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "4d67dfb052149f779f77e9ce089cea126e00657e8f0d11dafc7901fde4291101" 260 | dependencies = [ 261 | "cc", 262 | "libc", 263 | ] 264 | 265 | [[package]] 266 | name = "cexpr" 267 | version = "0.6.0" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 270 | dependencies = [ 271 | "nom", 272 | ] 273 | 274 | [[package]] 275 | name = "cfg-if" 276 | version = "1.0.0" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 279 | 280 | [[package]] 281 | name = "clang-sys" 282 | version = "1.8.1" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 285 | dependencies = [ 286 | "glob", 287 | "libc", 288 | "libloading", 289 | ] 290 | 291 | [[package]] 292 | name = "clap" 293 | version = "4.5.27" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" 296 | dependencies = [ 297 | "clap_builder", 298 | "clap_derive", 299 | ] 300 | 301 | [[package]] 302 | name = "clap-cargo" 303 | version = "0.14.1" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "23b2ea69cefa96b848b73ad516ad1d59a195cdf9263087d977f648a818c8b43e" 306 | dependencies = [ 307 | "anstyle", 308 | "cargo_metadata", 309 | "clap", 310 | ] 311 | 312 | [[package]] 313 | name = "clap_builder" 314 | version = "4.5.27" 315 | source = "registry+https://github.com/rust-lang/crates.io-index" 316 | checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" 317 | dependencies = [ 318 | "anstyle", 319 | "clap_lex", 320 | ] 321 | 322 | [[package]] 323 | name = "clap_derive" 324 | version = "4.5.24" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" 327 | dependencies = [ 328 | "heck", 329 | "proc-macro2", 330 | "quote", 331 | "syn", 332 | ] 333 | 334 | [[package]] 335 | name = "clap_lex" 336 | version = "0.7.4" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 339 | 340 | [[package]] 341 | name = "convert_case" 342 | version = "0.6.0" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" 345 | dependencies = [ 346 | "unicode-segmentation", 347 | ] 348 | 349 | [[package]] 350 | name = "core-foundation-sys" 351 | version = "0.8.7" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 354 | 355 | [[package]] 356 | name = "cpufeatures" 357 | version = "0.2.17" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 360 | dependencies = [ 361 | "libc", 362 | ] 363 | 364 | [[package]] 365 | name = "crossbeam-deque" 366 | version = "0.8.6" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 369 | dependencies = [ 370 | "crossbeam-epoch", 371 | "crossbeam-utils", 372 | ] 373 | 374 | [[package]] 375 | name = "crossbeam-epoch" 376 | version = "0.9.18" 377 | source = "registry+https://github.com/rust-lang/crates.io-index" 378 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 379 | dependencies = [ 380 | "crossbeam-utils", 381 | ] 382 | 383 | [[package]] 384 | name = "crossbeam-utils" 385 | version = "0.8.21" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 388 | 389 | [[package]] 390 | name = "crypto-common" 391 | version = "0.1.6" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 394 | dependencies = [ 395 | "generic-array", 396 | "typenum", 397 | ] 398 | 399 | [[package]] 400 | name = "digest" 401 | version = "0.10.7" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 404 | dependencies = [ 405 | "block-buffer", 406 | "crypto-common", 407 | "subtle", 408 | ] 409 | 410 | [[package]] 411 | name = "displaydoc" 412 | version = "0.2.5" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 415 | dependencies = [ 416 | "proc-macro2", 417 | "quote", 418 | "syn", 419 | ] 420 | 421 | [[package]] 422 | name = "either" 423 | version = "1.13.0" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 426 | 427 | [[package]] 428 | name = "email_address" 429 | version = "0.2.9" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" 432 | dependencies = [ 433 | "serde", 434 | ] 435 | 436 | [[package]] 437 | name = "enum-map" 438 | version = "2.7.3" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" 441 | dependencies = [ 442 | "enum-map-derive", 443 | ] 444 | 445 | [[package]] 446 | name = "enum-map-derive" 447 | version = "0.17.0" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" 450 | dependencies = [ 451 | "proc-macro2", 452 | "quote", 453 | "syn", 454 | ] 455 | 456 | [[package]] 457 | name = "equivalent" 458 | version = "1.0.1" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 461 | 462 | [[package]] 463 | name = "errno" 464 | version = "0.3.10" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 467 | dependencies = [ 468 | "libc", 469 | "windows-sys 0.59.0", 470 | ] 471 | 472 | [[package]] 473 | name = "eyre" 474 | version = "0.6.12" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" 477 | dependencies = [ 478 | "indenter", 479 | "once_cell", 480 | ] 481 | 482 | [[package]] 483 | name = "fallible-iterator" 484 | version = "0.2.0" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" 487 | 488 | [[package]] 489 | name = "fancy-regex" 490 | version = "0.14.0" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" 493 | dependencies = [ 494 | "bit-set", 495 | "regex-automata", 496 | "regex-syntax", 497 | ] 498 | 499 | [[package]] 500 | name = "fastrand" 501 | version = "2.3.0" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 504 | 505 | [[package]] 506 | name = "fixedbitset" 507 | version = "0.4.2" 508 | source = "registry+https://github.com/rust-lang/crates.io-index" 509 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 510 | 511 | [[package]] 512 | name = "fluent-uri" 513 | version = "0.3.2" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "1918b65d96df47d3591bed19c5cca17e3fa5d0707318e4b5ef2eae01764df7e5" 516 | dependencies = [ 517 | "borrow-or-share", 518 | "ref-cast", 519 | "serde", 520 | ] 521 | 522 | [[package]] 523 | name = "fnv" 524 | version = "1.0.7" 525 | source = "registry+https://github.com/rust-lang/crates.io-index" 526 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 527 | 528 | [[package]] 529 | name = "form_urlencoded" 530 | version = "1.2.1" 531 | source = "registry+https://github.com/rust-lang/crates.io-index" 532 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 533 | dependencies = [ 534 | "percent-encoding", 535 | ] 536 | 537 | [[package]] 538 | name = "fraction" 539 | version = "0.15.3" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "0f158e3ff0a1b334408dc9fb811cd99b446986f4d8b741bb08f9df1604085ae7" 542 | dependencies = [ 543 | "lazy_static", 544 | "num", 545 | ] 546 | 547 | [[package]] 548 | name = "funty" 549 | version = "2.0.0" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" 552 | 553 | [[package]] 554 | name = "futures-channel" 555 | version = "0.3.31" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 558 | dependencies = [ 559 | "futures-core", 560 | "futures-sink", 561 | ] 562 | 563 | [[package]] 564 | name = "futures-core" 565 | version = "0.3.31" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 568 | 569 | [[package]] 570 | name = "futures-macro" 571 | version = "0.3.31" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 574 | dependencies = [ 575 | "proc-macro2", 576 | "quote", 577 | "syn", 578 | ] 579 | 580 | [[package]] 581 | name = "futures-sink" 582 | version = "0.3.31" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 585 | 586 | [[package]] 587 | name = "futures-task" 588 | version = "0.3.31" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 591 | 592 | [[package]] 593 | name = "futures-util" 594 | version = "0.3.31" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 597 | dependencies = [ 598 | "futures-core", 599 | "futures-macro", 600 | "futures-sink", 601 | "futures-task", 602 | "pin-project-lite", 603 | "pin-utils", 604 | "slab", 605 | ] 606 | 607 | [[package]] 608 | name = "generic-array" 609 | version = "0.14.7" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 612 | dependencies = [ 613 | "typenum", 614 | "version_check", 615 | ] 616 | 617 | [[package]] 618 | name = "getrandom" 619 | version = "0.2.15" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 622 | dependencies = [ 623 | "cfg-if", 624 | "libc", 625 | "wasi 0.11.0+wasi-snapshot-preview1", 626 | ] 627 | 628 | [[package]] 629 | name = "getrandom" 630 | version = "0.3.1" 631 | source = "registry+https://github.com/rust-lang/crates.io-index" 632 | checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" 633 | dependencies = [ 634 | "cfg-if", 635 | "libc", 636 | "wasi 0.13.3+wasi-0.2.2", 637 | "windows-targets", 638 | ] 639 | 640 | [[package]] 641 | name = "gimli" 642 | version = "0.31.1" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 645 | 646 | [[package]] 647 | name = "glob" 648 | version = "0.3.2" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 651 | 652 | [[package]] 653 | name = "half" 654 | version = "1.8.3" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" 657 | 658 | [[package]] 659 | name = "hash32" 660 | version = "0.3.1" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" 663 | dependencies = [ 664 | "byteorder", 665 | ] 666 | 667 | [[package]] 668 | name = "hashbrown" 669 | version = "0.15.2" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 672 | 673 | [[package]] 674 | name = "heapless" 675 | version = "0.8.0" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" 678 | dependencies = [ 679 | "hash32", 680 | "stable_deref_trait", 681 | ] 682 | 683 | [[package]] 684 | name = "heck" 685 | version = "0.5.0" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 688 | 689 | [[package]] 690 | name = "hermit-abi" 691 | version = "0.4.0" 692 | source = "registry+https://github.com/rust-lang/crates.io-index" 693 | checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" 694 | 695 | [[package]] 696 | name = "hmac" 697 | version = "0.12.1" 698 | source = "registry+https://github.com/rust-lang/crates.io-index" 699 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 700 | dependencies = [ 701 | "digest", 702 | ] 703 | 704 | [[package]] 705 | name = "home" 706 | version = "0.5.11" 707 | source = "registry+https://github.com/rust-lang/crates.io-index" 708 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 709 | dependencies = [ 710 | "windows-sys 0.59.0", 711 | ] 712 | 713 | [[package]] 714 | name = "icu_collections" 715 | version = "1.5.0" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 718 | dependencies = [ 719 | "displaydoc", 720 | "yoke", 721 | "zerofrom", 722 | "zerovec", 723 | ] 724 | 725 | [[package]] 726 | name = "icu_locid" 727 | version = "1.5.0" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 730 | dependencies = [ 731 | "displaydoc", 732 | "litemap", 733 | "tinystr", 734 | "writeable", 735 | "zerovec", 736 | ] 737 | 738 | [[package]] 739 | name = "icu_locid_transform" 740 | version = "1.5.0" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 743 | dependencies = [ 744 | "displaydoc", 745 | "icu_locid", 746 | "icu_locid_transform_data", 747 | "icu_provider", 748 | "tinystr", 749 | "zerovec", 750 | ] 751 | 752 | [[package]] 753 | name = "icu_locid_transform_data" 754 | version = "1.5.0" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 757 | 758 | [[package]] 759 | name = "icu_normalizer" 760 | version = "1.5.0" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 763 | dependencies = [ 764 | "displaydoc", 765 | "icu_collections", 766 | "icu_normalizer_data", 767 | "icu_properties", 768 | "icu_provider", 769 | "smallvec", 770 | "utf16_iter", 771 | "utf8_iter", 772 | "write16", 773 | "zerovec", 774 | ] 775 | 776 | [[package]] 777 | name = "icu_normalizer_data" 778 | version = "1.5.0" 779 | source = "registry+https://github.com/rust-lang/crates.io-index" 780 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 781 | 782 | [[package]] 783 | name = "icu_properties" 784 | version = "1.5.1" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 787 | dependencies = [ 788 | "displaydoc", 789 | "icu_collections", 790 | "icu_locid_transform", 791 | "icu_properties_data", 792 | "icu_provider", 793 | "tinystr", 794 | "zerovec", 795 | ] 796 | 797 | [[package]] 798 | name = "icu_properties_data" 799 | version = "1.5.0" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 802 | 803 | [[package]] 804 | name = "icu_provider" 805 | version = "1.5.0" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 808 | dependencies = [ 809 | "displaydoc", 810 | "icu_locid", 811 | "icu_provider_macros", 812 | "stable_deref_trait", 813 | "tinystr", 814 | "writeable", 815 | "yoke", 816 | "zerofrom", 817 | "zerovec", 818 | ] 819 | 820 | [[package]] 821 | name = "icu_provider_macros" 822 | version = "1.5.0" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 825 | dependencies = [ 826 | "proc-macro2", 827 | "quote", 828 | "syn", 829 | ] 830 | 831 | [[package]] 832 | name = "idna" 833 | version = "1.0.3" 834 | source = "registry+https://github.com/rust-lang/crates.io-index" 835 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 836 | dependencies = [ 837 | "idna_adapter", 838 | "smallvec", 839 | "utf8_iter", 840 | ] 841 | 842 | [[package]] 843 | name = "idna_adapter" 844 | version = "1.2.0" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 847 | dependencies = [ 848 | "icu_normalizer", 849 | "icu_properties", 850 | ] 851 | 852 | [[package]] 853 | name = "indenter" 854 | version = "0.3.3" 855 | source = "registry+https://github.com/rust-lang/crates.io-index" 856 | checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" 857 | 858 | [[package]] 859 | name = "indexmap" 860 | version = "2.7.1" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 863 | dependencies = [ 864 | "equivalent", 865 | "hashbrown", 866 | ] 867 | 868 | [[package]] 869 | name = "is-terminal" 870 | version = "0.4.15" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" 873 | dependencies = [ 874 | "hermit-abi", 875 | "libc", 876 | "windows-sys 0.59.0", 877 | ] 878 | 879 | [[package]] 880 | name = "is_ci" 881 | version = "1.2.0" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" 884 | 885 | [[package]] 886 | name = "itertools" 887 | version = "0.13.0" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 890 | dependencies = [ 891 | "either", 892 | ] 893 | 894 | [[package]] 895 | name = "itoa" 896 | version = "1.0.14" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 899 | 900 | [[package]] 901 | name = "js-sys" 902 | version = "0.3.77" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 905 | dependencies = [ 906 | "once_cell", 907 | "wasm-bindgen", 908 | ] 909 | 910 | [[package]] 911 | name = "jsonschema" 912 | version = "0.28.3" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "4b8f66fe41fa46a5c83ed1c717b7e0b4635988f427083108c8cf0a882cc13441" 915 | dependencies = [ 916 | "ahash", 917 | "base64", 918 | "bytecount", 919 | "email_address", 920 | "fancy-regex", 921 | "fraction", 922 | "idna", 923 | "itoa", 924 | "num-cmp", 925 | "once_cell", 926 | "percent-encoding", 927 | "referencing", 928 | "regex-syntax", 929 | "serde", 930 | "serde_json", 931 | "uuid-simd", 932 | ] 933 | 934 | [[package]] 935 | name = "lazy_static" 936 | version = "1.5.0" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 939 | 940 | [[package]] 941 | name = "libc" 942 | version = "0.2.169" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 945 | 946 | [[package]] 947 | name = "libloading" 948 | version = "0.8.6" 949 | source = "registry+https://github.com/rust-lang/crates.io-index" 950 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 951 | dependencies = [ 952 | "cfg-if", 953 | "windows-targets", 954 | ] 955 | 956 | [[package]] 957 | name = "linux-raw-sys" 958 | version = "0.4.15" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 961 | 962 | [[package]] 963 | name = "litemap" 964 | version = "0.7.4" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 967 | 968 | [[package]] 969 | name = "lock_api" 970 | version = "0.4.12" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 973 | dependencies = [ 974 | "autocfg", 975 | "scopeguard", 976 | ] 977 | 978 | [[package]] 979 | name = "log" 980 | version = "0.4.25" 981 | source = "registry+https://github.com/rust-lang/crates.io-index" 982 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 983 | 984 | [[package]] 985 | name = "md-5" 986 | version = "0.10.6" 987 | source = "registry+https://github.com/rust-lang/crates.io-index" 988 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 989 | dependencies = [ 990 | "cfg-if", 991 | "digest", 992 | ] 993 | 994 | [[package]] 995 | name = "memchr" 996 | version = "2.7.4" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 999 | 1000 | [[package]] 1001 | name = "minimal-lexical" 1002 | version = "0.2.1" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1005 | 1006 | [[package]] 1007 | name = "miniz_oxide" 1008 | version = "0.8.3" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" 1011 | dependencies = [ 1012 | "adler2", 1013 | ] 1014 | 1015 | [[package]] 1016 | name = "mio" 1017 | version = "1.0.3" 1018 | source = "registry+https://github.com/rust-lang/crates.io-index" 1019 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1020 | dependencies = [ 1021 | "libc", 1022 | "wasi 0.11.0+wasi-snapshot-preview1", 1023 | "windows-sys 0.52.0", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "nom" 1028 | version = "7.1.3" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1031 | dependencies = [ 1032 | "memchr", 1033 | "minimal-lexical", 1034 | ] 1035 | 1036 | [[package]] 1037 | name = "ntapi" 1038 | version = "0.4.1" 1039 | source = "registry+https://github.com/rust-lang/crates.io-index" 1040 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 1041 | dependencies = [ 1042 | "winapi", 1043 | ] 1044 | 1045 | [[package]] 1046 | name = "num" 1047 | version = "0.4.3" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" 1050 | dependencies = [ 1051 | "num-bigint", 1052 | "num-complex", 1053 | "num-integer", 1054 | "num-iter", 1055 | "num-rational", 1056 | "num-traits", 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "num-bigint" 1061 | version = "0.4.6" 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" 1063 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1064 | dependencies = [ 1065 | "num-integer", 1066 | "num-traits", 1067 | ] 1068 | 1069 | [[package]] 1070 | name = "num-cmp" 1071 | version = "0.1.0" 1072 | source = "registry+https://github.com/rust-lang/crates.io-index" 1073 | checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa" 1074 | 1075 | [[package]] 1076 | name = "num-complex" 1077 | version = "0.4.6" 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" 1079 | checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" 1080 | dependencies = [ 1081 | "num-traits", 1082 | ] 1083 | 1084 | [[package]] 1085 | name = "num-integer" 1086 | version = "0.1.46" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1089 | dependencies = [ 1090 | "num-traits", 1091 | ] 1092 | 1093 | [[package]] 1094 | name = "num-iter" 1095 | version = "0.1.45" 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" 1097 | checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 1098 | dependencies = [ 1099 | "autocfg", 1100 | "num-integer", 1101 | "num-traits", 1102 | ] 1103 | 1104 | [[package]] 1105 | name = "num-rational" 1106 | version = "0.4.2" 1107 | source = "registry+https://github.com/rust-lang/crates.io-index" 1108 | checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" 1109 | dependencies = [ 1110 | "num-bigint", 1111 | "num-integer", 1112 | "num-traits", 1113 | ] 1114 | 1115 | [[package]] 1116 | name = "num-traits" 1117 | version = "0.2.19" 1118 | source = "registry+https://github.com/rust-lang/crates.io-index" 1119 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1120 | dependencies = [ 1121 | "autocfg", 1122 | ] 1123 | 1124 | [[package]] 1125 | name = "object" 1126 | version = "0.36.7" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1129 | dependencies = [ 1130 | "memchr", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "once_cell" 1135 | version = "1.20.2" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 1138 | 1139 | [[package]] 1140 | name = "outref" 1141 | version = "0.5.2" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" 1144 | 1145 | [[package]] 1146 | name = "owo-colors" 1147 | version = "4.1.0" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "fb37767f6569cd834a413442455e0f066d0d522de8630436e2a1761d9726ba56" 1150 | dependencies = [ 1151 | "supports-color 2.1.0", 1152 | "supports-color 3.0.2", 1153 | ] 1154 | 1155 | [[package]] 1156 | name = "parking_lot" 1157 | version = "0.12.3" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1160 | dependencies = [ 1161 | "lock_api", 1162 | "parking_lot_core", 1163 | ] 1164 | 1165 | [[package]] 1166 | name = "parking_lot_core" 1167 | version = "0.9.10" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1170 | dependencies = [ 1171 | "cfg-if", 1172 | "libc", 1173 | "redox_syscall", 1174 | "smallvec", 1175 | "windows-targets", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "paste" 1180 | version = "1.0.15" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1183 | 1184 | [[package]] 1185 | name = "pathsearch" 1186 | version = "0.2.0" 1187 | source = "registry+https://github.com/rust-lang/crates.io-index" 1188 | checksum = "da983bc5e582ab17179c190b4b66c7d76c5943a69c6d34df2a2b6bf8a2977b05" 1189 | dependencies = [ 1190 | "anyhow", 1191 | "libc", 1192 | ] 1193 | 1194 | [[package]] 1195 | name = "percent-encoding" 1196 | version = "2.3.1" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1199 | 1200 | [[package]] 1201 | name = "pest" 1202 | version = "2.7.15" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" 1205 | dependencies = [ 1206 | "memchr", 1207 | "thiserror 2.0.11", 1208 | "ucd-trie", 1209 | ] 1210 | 1211 | [[package]] 1212 | name = "petgraph" 1213 | version = "0.6.5" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" 1216 | dependencies = [ 1217 | "fixedbitset", 1218 | "indexmap", 1219 | ] 1220 | 1221 | [[package]] 1222 | name = "pg_jsonschema" 1223 | version = "0.3.3" 1224 | dependencies = [ 1225 | "jsonschema", 1226 | "pgrx", 1227 | "pgrx-tests", 1228 | "serde", 1229 | "serde_json", 1230 | ] 1231 | 1232 | [[package]] 1233 | name = "pgrx" 1234 | version = "0.12.9" 1235 | source = "registry+https://github.com/rust-lang/crates.io-index" 1236 | checksum = "227bf7e162ce710994306a97bc56bb3fe305f21120ab6692e2151c48416f5c0d" 1237 | dependencies = [ 1238 | "atomic-traits", 1239 | "bitflags", 1240 | "bitvec", 1241 | "enum-map", 1242 | "heapless", 1243 | "libc", 1244 | "once_cell", 1245 | "pgrx-macros", 1246 | "pgrx-pg-sys", 1247 | "pgrx-sql-entity-graph", 1248 | "seahash", 1249 | "serde", 1250 | "serde_cbor", 1251 | "serde_json", 1252 | "thiserror 1.0.69", 1253 | "uuid", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "pgrx-bindgen" 1258 | version = "0.12.9" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "81cbcd956c2da35baaf0a116e6f6a49a6c2fbc8f6b332f66d6fd060bfd00615f" 1261 | dependencies = [ 1262 | "bindgen", 1263 | "cc", 1264 | "clang-sys", 1265 | "eyre", 1266 | "pgrx-pg-config", 1267 | "proc-macro2", 1268 | "quote", 1269 | "shlex", 1270 | "syn", 1271 | "walkdir", 1272 | ] 1273 | 1274 | [[package]] 1275 | name = "pgrx-macros" 1276 | version = "0.12.9" 1277 | source = "registry+https://github.com/rust-lang/crates.io-index" 1278 | checksum = "e2f4291450d65e4deb770ce57ea93e22353d97950566222429cd166ebdf6f938" 1279 | dependencies = [ 1280 | "pgrx-sql-entity-graph", 1281 | "proc-macro2", 1282 | "quote", 1283 | "syn", 1284 | ] 1285 | 1286 | [[package]] 1287 | name = "pgrx-pg-config" 1288 | version = "0.12.9" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "86a64a4c6e4e43e73cf8d3379d9533df98ded45c920e1ba8131c979633d74132" 1291 | dependencies = [ 1292 | "cargo_toml", 1293 | "eyre", 1294 | "home", 1295 | "owo-colors", 1296 | "pathsearch", 1297 | "serde", 1298 | "serde_json", 1299 | "thiserror 1.0.69", 1300 | "toml", 1301 | "url", 1302 | ] 1303 | 1304 | [[package]] 1305 | name = "pgrx-pg-sys" 1306 | version = "0.12.9" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "63a5dc64f2a8226434118aa2c4700450fa42b04f29488ad98268848b21c1a4ec" 1309 | dependencies = [ 1310 | "cee-scape", 1311 | "libc", 1312 | "pgrx-bindgen", 1313 | "pgrx-macros", 1314 | "pgrx-sql-entity-graph", 1315 | "serde", 1316 | "sptr", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "pgrx-sql-entity-graph" 1321 | version = "0.12.9" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "d81cc2e851c7e36b2f47c03e22d64d56c1d0e762fbde0039ba2cd490cfef3615" 1324 | dependencies = [ 1325 | "convert_case", 1326 | "eyre", 1327 | "petgraph", 1328 | "proc-macro2", 1329 | "quote", 1330 | "syn", 1331 | "thiserror 1.0.69", 1332 | "unescape", 1333 | ] 1334 | 1335 | [[package]] 1336 | name = "pgrx-tests" 1337 | version = "0.12.9" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "0c2dd5d674cb7d92024709543da06d26723a2f7450c02083116b232587160929" 1340 | dependencies = [ 1341 | "clap-cargo", 1342 | "eyre", 1343 | "libc", 1344 | "owo-colors", 1345 | "paste", 1346 | "pgrx", 1347 | "pgrx-macros", 1348 | "pgrx-pg-config", 1349 | "postgres", 1350 | "proptest", 1351 | "rand 0.8.5", 1352 | "regex", 1353 | "serde", 1354 | "serde_json", 1355 | "sysinfo", 1356 | "thiserror 1.0.69", 1357 | ] 1358 | 1359 | [[package]] 1360 | name = "phf" 1361 | version = "0.11.3" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" 1364 | dependencies = [ 1365 | "phf_shared", 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "phf_shared" 1370 | version = "0.11.3" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 1373 | dependencies = [ 1374 | "siphasher", 1375 | ] 1376 | 1377 | [[package]] 1378 | name = "pin-project-lite" 1379 | version = "0.2.16" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1382 | 1383 | [[package]] 1384 | name = "pin-utils" 1385 | version = "0.1.0" 1386 | source = "registry+https://github.com/rust-lang/crates.io-index" 1387 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1388 | 1389 | [[package]] 1390 | name = "postgres" 1391 | version = "0.19.10" 1392 | source = "registry+https://github.com/rust-lang/crates.io-index" 1393 | checksum = "363e6dfbdd780d3aa3597b6eb430db76bb315fa9bad7fae595bb8def808b8470" 1394 | dependencies = [ 1395 | "bytes", 1396 | "fallible-iterator", 1397 | "futures-util", 1398 | "log", 1399 | "tokio", 1400 | "tokio-postgres", 1401 | ] 1402 | 1403 | [[package]] 1404 | name = "postgres-protocol" 1405 | version = "0.6.8" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" 1408 | dependencies = [ 1409 | "base64", 1410 | "byteorder", 1411 | "bytes", 1412 | "fallible-iterator", 1413 | "hmac", 1414 | "md-5", 1415 | "memchr", 1416 | "rand 0.9.0", 1417 | "sha2", 1418 | "stringprep", 1419 | ] 1420 | 1421 | [[package]] 1422 | name = "postgres-types" 1423 | version = "0.2.9" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" 1426 | dependencies = [ 1427 | "bytes", 1428 | "fallible-iterator", 1429 | "postgres-protocol", 1430 | ] 1431 | 1432 | [[package]] 1433 | name = "ppv-lite86" 1434 | version = "0.2.20" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1437 | dependencies = [ 1438 | "zerocopy 0.7.35", 1439 | ] 1440 | 1441 | [[package]] 1442 | name = "proc-macro2" 1443 | version = "1.0.93" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 1446 | dependencies = [ 1447 | "unicode-ident", 1448 | ] 1449 | 1450 | [[package]] 1451 | name = "proptest" 1452 | version = "1.6.0" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" 1455 | dependencies = [ 1456 | "bit-set", 1457 | "bit-vec", 1458 | "bitflags", 1459 | "lazy_static", 1460 | "num-traits", 1461 | "rand 0.8.5", 1462 | "rand_chacha 0.3.1", 1463 | "rand_xorshift", 1464 | "regex-syntax", 1465 | "rusty-fork", 1466 | "tempfile", 1467 | "unarray", 1468 | ] 1469 | 1470 | [[package]] 1471 | name = "quick-error" 1472 | version = "1.2.3" 1473 | source = "registry+https://github.com/rust-lang/crates.io-index" 1474 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 1475 | 1476 | [[package]] 1477 | name = "quote" 1478 | version = "1.0.38" 1479 | source = "registry+https://github.com/rust-lang/crates.io-index" 1480 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 1481 | dependencies = [ 1482 | "proc-macro2", 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "radium" 1487 | version = "0.7.0" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" 1490 | 1491 | [[package]] 1492 | name = "rand" 1493 | version = "0.8.5" 1494 | source = "registry+https://github.com/rust-lang/crates.io-index" 1495 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1496 | dependencies = [ 1497 | "libc", 1498 | "rand_chacha 0.3.1", 1499 | "rand_core 0.6.4", 1500 | ] 1501 | 1502 | [[package]] 1503 | name = "rand" 1504 | version = "0.9.0" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" 1507 | dependencies = [ 1508 | "rand_chacha 0.9.0", 1509 | "rand_core 0.9.0", 1510 | "zerocopy 0.8.14", 1511 | ] 1512 | 1513 | [[package]] 1514 | name = "rand_chacha" 1515 | version = "0.3.1" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1518 | dependencies = [ 1519 | "ppv-lite86", 1520 | "rand_core 0.6.4", 1521 | ] 1522 | 1523 | [[package]] 1524 | name = "rand_chacha" 1525 | version = "0.9.0" 1526 | source = "registry+https://github.com/rust-lang/crates.io-index" 1527 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1528 | dependencies = [ 1529 | "ppv-lite86", 1530 | "rand_core 0.9.0", 1531 | ] 1532 | 1533 | [[package]] 1534 | name = "rand_core" 1535 | version = "0.6.4" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1538 | dependencies = [ 1539 | "getrandom 0.2.15", 1540 | ] 1541 | 1542 | [[package]] 1543 | name = "rand_core" 1544 | version = "0.9.0" 1545 | source = "registry+https://github.com/rust-lang/crates.io-index" 1546 | checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" 1547 | dependencies = [ 1548 | "getrandom 0.3.1", 1549 | "zerocopy 0.8.14", 1550 | ] 1551 | 1552 | [[package]] 1553 | name = "rand_xorshift" 1554 | version = "0.3.0" 1555 | source = "registry+https://github.com/rust-lang/crates.io-index" 1556 | checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" 1557 | dependencies = [ 1558 | "rand_core 0.6.4", 1559 | ] 1560 | 1561 | [[package]] 1562 | name = "rayon" 1563 | version = "1.10.0" 1564 | source = "registry+https://github.com/rust-lang/crates.io-index" 1565 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1566 | dependencies = [ 1567 | "either", 1568 | "rayon-core", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "rayon-core" 1573 | version = "1.12.1" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1576 | dependencies = [ 1577 | "crossbeam-deque", 1578 | "crossbeam-utils", 1579 | ] 1580 | 1581 | [[package]] 1582 | name = "redox_syscall" 1583 | version = "0.5.8" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 1586 | dependencies = [ 1587 | "bitflags", 1588 | ] 1589 | 1590 | [[package]] 1591 | name = "ref-cast" 1592 | version = "1.0.23" 1593 | source = "registry+https://github.com/rust-lang/crates.io-index" 1594 | checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" 1595 | dependencies = [ 1596 | "ref-cast-impl", 1597 | ] 1598 | 1599 | [[package]] 1600 | name = "ref-cast-impl" 1601 | version = "1.0.23" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" 1604 | dependencies = [ 1605 | "proc-macro2", 1606 | "quote", 1607 | "syn", 1608 | ] 1609 | 1610 | [[package]] 1611 | name = "referencing" 1612 | version = "0.28.3" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | checksum = "d0dcb5ab28989ad7c91eb1b9531a37a1a137cc69a0499aee4117cae4a107c464" 1615 | dependencies = [ 1616 | "ahash", 1617 | "fluent-uri", 1618 | "once_cell", 1619 | "percent-encoding", 1620 | "serde_json", 1621 | ] 1622 | 1623 | [[package]] 1624 | name = "regex" 1625 | version = "1.11.1" 1626 | source = "registry+https://github.com/rust-lang/crates.io-index" 1627 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1628 | dependencies = [ 1629 | "aho-corasick", 1630 | "memchr", 1631 | "regex-automata", 1632 | "regex-syntax", 1633 | ] 1634 | 1635 | [[package]] 1636 | name = "regex-automata" 1637 | version = "0.4.9" 1638 | source = "registry+https://github.com/rust-lang/crates.io-index" 1639 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1640 | dependencies = [ 1641 | "aho-corasick", 1642 | "memchr", 1643 | "regex-syntax", 1644 | ] 1645 | 1646 | [[package]] 1647 | name = "regex-syntax" 1648 | version = "0.8.5" 1649 | source = "registry+https://github.com/rust-lang/crates.io-index" 1650 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1651 | 1652 | [[package]] 1653 | name = "rustc-demangle" 1654 | version = "0.1.24" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1657 | 1658 | [[package]] 1659 | name = "rustc-hash" 1660 | version = "1.1.0" 1661 | source = "registry+https://github.com/rust-lang/crates.io-index" 1662 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1663 | 1664 | [[package]] 1665 | name = "rustc_version" 1666 | version = "0.3.3" 1667 | source = "registry+https://github.com/rust-lang/crates.io-index" 1668 | checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" 1669 | dependencies = [ 1670 | "semver 0.11.0", 1671 | ] 1672 | 1673 | [[package]] 1674 | name = "rustix" 1675 | version = "0.38.44" 1676 | source = "registry+https://github.com/rust-lang/crates.io-index" 1677 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1678 | dependencies = [ 1679 | "bitflags", 1680 | "errno", 1681 | "libc", 1682 | "linux-raw-sys", 1683 | "windows-sys 0.59.0", 1684 | ] 1685 | 1686 | [[package]] 1687 | name = "rusty-fork" 1688 | version = "0.3.0" 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" 1690 | checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" 1691 | dependencies = [ 1692 | "fnv", 1693 | "quick-error", 1694 | "tempfile", 1695 | "wait-timeout", 1696 | ] 1697 | 1698 | [[package]] 1699 | name = "ryu" 1700 | version = "1.0.19" 1701 | source = "registry+https://github.com/rust-lang/crates.io-index" 1702 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 1703 | 1704 | [[package]] 1705 | name = "same-file" 1706 | version = "1.0.6" 1707 | source = "registry+https://github.com/rust-lang/crates.io-index" 1708 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1709 | dependencies = [ 1710 | "winapi-util", 1711 | ] 1712 | 1713 | [[package]] 1714 | name = "scopeguard" 1715 | version = "1.2.0" 1716 | source = "registry+https://github.com/rust-lang/crates.io-index" 1717 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1718 | 1719 | [[package]] 1720 | name = "seahash" 1721 | version = "4.1.0" 1722 | source = "registry+https://github.com/rust-lang/crates.io-index" 1723 | checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" 1724 | 1725 | [[package]] 1726 | name = "semver" 1727 | version = "0.11.0" 1728 | source = "registry+https://github.com/rust-lang/crates.io-index" 1729 | checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" 1730 | dependencies = [ 1731 | "semver-parser", 1732 | ] 1733 | 1734 | [[package]] 1735 | name = "semver" 1736 | version = "1.0.25" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" 1739 | dependencies = [ 1740 | "serde", 1741 | ] 1742 | 1743 | [[package]] 1744 | name = "semver-parser" 1745 | version = "0.10.3" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" 1748 | dependencies = [ 1749 | "pest", 1750 | ] 1751 | 1752 | [[package]] 1753 | name = "serde" 1754 | version = "1.0.217" 1755 | source = "registry+https://github.com/rust-lang/crates.io-index" 1756 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 1757 | dependencies = [ 1758 | "serde_derive", 1759 | ] 1760 | 1761 | [[package]] 1762 | name = "serde_cbor" 1763 | version = "0.11.2" 1764 | source = "registry+https://github.com/rust-lang/crates.io-index" 1765 | checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" 1766 | dependencies = [ 1767 | "half", 1768 | "serde", 1769 | ] 1770 | 1771 | [[package]] 1772 | name = "serde_derive" 1773 | version = "1.0.217" 1774 | source = "registry+https://github.com/rust-lang/crates.io-index" 1775 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 1776 | dependencies = [ 1777 | "proc-macro2", 1778 | "quote", 1779 | "syn", 1780 | ] 1781 | 1782 | [[package]] 1783 | name = "serde_json" 1784 | version = "1.0.138" 1785 | source = "registry+https://github.com/rust-lang/crates.io-index" 1786 | checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" 1787 | dependencies = [ 1788 | "itoa", 1789 | "memchr", 1790 | "ryu", 1791 | "serde", 1792 | ] 1793 | 1794 | [[package]] 1795 | name = "serde_spanned" 1796 | version = "0.6.8" 1797 | source = "registry+https://github.com/rust-lang/crates.io-index" 1798 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 1799 | dependencies = [ 1800 | "serde", 1801 | ] 1802 | 1803 | [[package]] 1804 | name = "sha2" 1805 | version = "0.10.8" 1806 | source = "registry+https://github.com/rust-lang/crates.io-index" 1807 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1808 | dependencies = [ 1809 | "cfg-if", 1810 | "cpufeatures", 1811 | "digest", 1812 | ] 1813 | 1814 | [[package]] 1815 | name = "shlex" 1816 | version = "1.3.0" 1817 | source = "registry+https://github.com/rust-lang/crates.io-index" 1818 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1819 | 1820 | [[package]] 1821 | name = "siphasher" 1822 | version = "1.0.1" 1823 | source = "registry+https://github.com/rust-lang/crates.io-index" 1824 | checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 1825 | 1826 | [[package]] 1827 | name = "slab" 1828 | version = "0.4.9" 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" 1830 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1831 | dependencies = [ 1832 | "autocfg", 1833 | ] 1834 | 1835 | [[package]] 1836 | name = "smallvec" 1837 | version = "1.13.2" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1840 | 1841 | [[package]] 1842 | name = "socket2" 1843 | version = "0.5.8" 1844 | source = "registry+https://github.com/rust-lang/crates.io-index" 1845 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 1846 | dependencies = [ 1847 | "libc", 1848 | "windows-sys 0.52.0", 1849 | ] 1850 | 1851 | [[package]] 1852 | name = "sptr" 1853 | version = "0.3.2" 1854 | source = "registry+https://github.com/rust-lang/crates.io-index" 1855 | checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" 1856 | 1857 | [[package]] 1858 | name = "stable_deref_trait" 1859 | version = "1.2.0" 1860 | source = "registry+https://github.com/rust-lang/crates.io-index" 1861 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1862 | 1863 | [[package]] 1864 | name = "stringprep" 1865 | version = "0.1.5" 1866 | source = "registry+https://github.com/rust-lang/crates.io-index" 1867 | checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 1868 | dependencies = [ 1869 | "unicode-bidi", 1870 | "unicode-normalization", 1871 | "unicode-properties", 1872 | ] 1873 | 1874 | [[package]] 1875 | name = "subtle" 1876 | version = "2.6.1" 1877 | source = "registry+https://github.com/rust-lang/crates.io-index" 1878 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1879 | 1880 | [[package]] 1881 | name = "supports-color" 1882 | version = "2.1.0" 1883 | source = "registry+https://github.com/rust-lang/crates.io-index" 1884 | checksum = "d6398cde53adc3c4557306a96ce67b302968513830a77a95b2b17305d9719a89" 1885 | dependencies = [ 1886 | "is-terminal", 1887 | "is_ci", 1888 | ] 1889 | 1890 | [[package]] 1891 | name = "supports-color" 1892 | version = "3.0.2" 1893 | source = "registry+https://github.com/rust-lang/crates.io-index" 1894 | checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" 1895 | dependencies = [ 1896 | "is_ci", 1897 | ] 1898 | 1899 | [[package]] 1900 | name = "syn" 1901 | version = "2.0.98" 1902 | source = "registry+https://github.com/rust-lang/crates.io-index" 1903 | checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 1904 | dependencies = [ 1905 | "proc-macro2", 1906 | "quote", 1907 | "unicode-ident", 1908 | ] 1909 | 1910 | [[package]] 1911 | name = "synstructure" 1912 | version = "0.13.1" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1915 | dependencies = [ 1916 | "proc-macro2", 1917 | "quote", 1918 | "syn", 1919 | ] 1920 | 1921 | [[package]] 1922 | name = "sysinfo" 1923 | version = "0.30.13" 1924 | source = "registry+https://github.com/rust-lang/crates.io-index" 1925 | checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" 1926 | dependencies = [ 1927 | "cfg-if", 1928 | "core-foundation-sys", 1929 | "libc", 1930 | "ntapi", 1931 | "once_cell", 1932 | "rayon", 1933 | "windows", 1934 | ] 1935 | 1936 | [[package]] 1937 | name = "tap" 1938 | version = "1.0.1" 1939 | source = "registry+https://github.com/rust-lang/crates.io-index" 1940 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 1941 | 1942 | [[package]] 1943 | name = "tempfile" 1944 | version = "3.16.0" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" 1947 | dependencies = [ 1948 | "cfg-if", 1949 | "fastrand", 1950 | "getrandom 0.3.1", 1951 | "once_cell", 1952 | "rustix", 1953 | "windows-sys 0.59.0", 1954 | ] 1955 | 1956 | [[package]] 1957 | name = "thiserror" 1958 | version = "1.0.69" 1959 | source = "registry+https://github.com/rust-lang/crates.io-index" 1960 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1961 | dependencies = [ 1962 | "thiserror-impl 1.0.69", 1963 | ] 1964 | 1965 | [[package]] 1966 | name = "thiserror" 1967 | version = "2.0.11" 1968 | source = "registry+https://github.com/rust-lang/crates.io-index" 1969 | checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" 1970 | dependencies = [ 1971 | "thiserror-impl 2.0.11", 1972 | ] 1973 | 1974 | [[package]] 1975 | name = "thiserror-impl" 1976 | version = "1.0.69" 1977 | source = "registry+https://github.com/rust-lang/crates.io-index" 1978 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1979 | dependencies = [ 1980 | "proc-macro2", 1981 | "quote", 1982 | "syn", 1983 | ] 1984 | 1985 | [[package]] 1986 | name = "thiserror-impl" 1987 | version = "2.0.11" 1988 | source = "registry+https://github.com/rust-lang/crates.io-index" 1989 | checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" 1990 | dependencies = [ 1991 | "proc-macro2", 1992 | "quote", 1993 | "syn", 1994 | ] 1995 | 1996 | [[package]] 1997 | name = "tinystr" 1998 | version = "0.7.6" 1999 | source = "registry+https://github.com/rust-lang/crates.io-index" 2000 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 2001 | dependencies = [ 2002 | "displaydoc", 2003 | "zerovec", 2004 | ] 2005 | 2006 | [[package]] 2007 | name = "tinyvec" 2008 | version = "1.8.1" 2009 | source = "registry+https://github.com/rust-lang/crates.io-index" 2010 | checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" 2011 | dependencies = [ 2012 | "tinyvec_macros", 2013 | ] 2014 | 2015 | [[package]] 2016 | name = "tinyvec_macros" 2017 | version = "0.1.1" 2018 | source = "registry+https://github.com/rust-lang/crates.io-index" 2019 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2020 | 2021 | [[package]] 2022 | name = "tokio" 2023 | version = "1.44.2" 2024 | source = "registry+https://github.com/rust-lang/crates.io-index" 2025 | checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" 2026 | dependencies = [ 2027 | "backtrace", 2028 | "bytes", 2029 | "libc", 2030 | "mio", 2031 | "pin-project-lite", 2032 | "socket2", 2033 | "windows-sys 0.52.0", 2034 | ] 2035 | 2036 | [[package]] 2037 | name = "tokio-postgres" 2038 | version = "0.7.13" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "6c95d533c83082bb6490e0189acaa0bbeef9084e60471b696ca6988cd0541fb0" 2041 | dependencies = [ 2042 | "async-trait", 2043 | "byteorder", 2044 | "bytes", 2045 | "fallible-iterator", 2046 | "futures-channel", 2047 | "futures-util", 2048 | "log", 2049 | "parking_lot", 2050 | "percent-encoding", 2051 | "phf", 2052 | "pin-project-lite", 2053 | "postgres-protocol", 2054 | "postgres-types", 2055 | "rand 0.9.0", 2056 | "socket2", 2057 | "tokio", 2058 | "tokio-util", 2059 | "whoami", 2060 | ] 2061 | 2062 | [[package]] 2063 | name = "tokio-util" 2064 | version = "0.7.13" 2065 | source = "registry+https://github.com/rust-lang/crates.io-index" 2066 | checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" 2067 | dependencies = [ 2068 | "bytes", 2069 | "futures-core", 2070 | "futures-sink", 2071 | "pin-project-lite", 2072 | "tokio", 2073 | ] 2074 | 2075 | [[package]] 2076 | name = "toml" 2077 | version = "0.8.19" 2078 | source = "registry+https://github.com/rust-lang/crates.io-index" 2079 | checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" 2080 | dependencies = [ 2081 | "serde", 2082 | "serde_spanned", 2083 | "toml_datetime", 2084 | "toml_edit", 2085 | ] 2086 | 2087 | [[package]] 2088 | name = "toml_datetime" 2089 | version = "0.6.8" 2090 | source = "registry+https://github.com/rust-lang/crates.io-index" 2091 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 2092 | dependencies = [ 2093 | "serde", 2094 | ] 2095 | 2096 | [[package]] 2097 | name = "toml_edit" 2098 | version = "0.22.23" 2099 | source = "registry+https://github.com/rust-lang/crates.io-index" 2100 | checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" 2101 | dependencies = [ 2102 | "indexmap", 2103 | "serde", 2104 | "serde_spanned", 2105 | "toml_datetime", 2106 | "winnow", 2107 | ] 2108 | 2109 | [[package]] 2110 | name = "typenum" 2111 | version = "1.17.0" 2112 | source = "registry+https://github.com/rust-lang/crates.io-index" 2113 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2114 | 2115 | [[package]] 2116 | name = "ucd-trie" 2117 | version = "0.1.7" 2118 | source = "registry+https://github.com/rust-lang/crates.io-index" 2119 | checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" 2120 | 2121 | [[package]] 2122 | name = "unarray" 2123 | version = "0.1.4" 2124 | source = "registry+https://github.com/rust-lang/crates.io-index" 2125 | checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" 2126 | 2127 | [[package]] 2128 | name = "unescape" 2129 | version = "0.1.0" 2130 | source = "registry+https://github.com/rust-lang/crates.io-index" 2131 | checksum = "ccb97dac3243214f8d8507998906ca3e2e0b900bf9bf4870477f125b82e68f6e" 2132 | 2133 | [[package]] 2134 | name = "unicode-bidi" 2135 | version = "0.3.18" 2136 | source = "registry+https://github.com/rust-lang/crates.io-index" 2137 | checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 2138 | 2139 | [[package]] 2140 | name = "unicode-ident" 2141 | version = "1.0.16" 2142 | source = "registry+https://github.com/rust-lang/crates.io-index" 2143 | checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" 2144 | 2145 | [[package]] 2146 | name = "unicode-normalization" 2147 | version = "0.1.24" 2148 | source = "registry+https://github.com/rust-lang/crates.io-index" 2149 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 2150 | dependencies = [ 2151 | "tinyvec", 2152 | ] 2153 | 2154 | [[package]] 2155 | name = "unicode-properties" 2156 | version = "0.1.3" 2157 | source = "registry+https://github.com/rust-lang/crates.io-index" 2158 | checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 2159 | 2160 | [[package]] 2161 | name = "unicode-segmentation" 2162 | version = "1.12.0" 2163 | source = "registry+https://github.com/rust-lang/crates.io-index" 2164 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 2165 | 2166 | [[package]] 2167 | name = "unicode-width" 2168 | version = "0.1.14" 2169 | source = "registry+https://github.com/rust-lang/crates.io-index" 2170 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 2171 | 2172 | [[package]] 2173 | name = "url" 2174 | version = "2.5.4" 2175 | source = "registry+https://github.com/rust-lang/crates.io-index" 2176 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 2177 | dependencies = [ 2178 | "form_urlencoded", 2179 | "idna", 2180 | "percent-encoding", 2181 | ] 2182 | 2183 | [[package]] 2184 | name = "utf16_iter" 2185 | version = "1.0.5" 2186 | source = "registry+https://github.com/rust-lang/crates.io-index" 2187 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 2188 | 2189 | [[package]] 2190 | name = "utf8_iter" 2191 | version = "1.0.4" 2192 | source = "registry+https://github.com/rust-lang/crates.io-index" 2193 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2194 | 2195 | [[package]] 2196 | name = "uuid" 2197 | version = "1.12.1" 2198 | source = "registry+https://github.com/rust-lang/crates.io-index" 2199 | checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" 2200 | dependencies = [ 2201 | "getrandom 0.2.15", 2202 | ] 2203 | 2204 | [[package]] 2205 | name = "uuid-simd" 2206 | version = "0.8.0" 2207 | source = "registry+https://github.com/rust-lang/crates.io-index" 2208 | checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8" 2209 | dependencies = [ 2210 | "outref", 2211 | "uuid", 2212 | "vsimd", 2213 | ] 2214 | 2215 | [[package]] 2216 | name = "version_check" 2217 | version = "0.9.5" 2218 | source = "registry+https://github.com/rust-lang/crates.io-index" 2219 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2220 | 2221 | [[package]] 2222 | name = "vsimd" 2223 | version = "0.8.0" 2224 | source = "registry+https://github.com/rust-lang/crates.io-index" 2225 | checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" 2226 | 2227 | [[package]] 2228 | name = "wait-timeout" 2229 | version = "0.2.1" 2230 | source = "registry+https://github.com/rust-lang/crates.io-index" 2231 | checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" 2232 | dependencies = [ 2233 | "libc", 2234 | ] 2235 | 2236 | [[package]] 2237 | name = "walkdir" 2238 | version = "2.5.0" 2239 | source = "registry+https://github.com/rust-lang/crates.io-index" 2240 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 2241 | dependencies = [ 2242 | "same-file", 2243 | "winapi-util", 2244 | ] 2245 | 2246 | [[package]] 2247 | name = "wasi" 2248 | version = "0.11.0+wasi-snapshot-preview1" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2251 | 2252 | [[package]] 2253 | name = "wasi" 2254 | version = "0.13.3+wasi-0.2.2" 2255 | source = "registry+https://github.com/rust-lang/crates.io-index" 2256 | checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" 2257 | dependencies = [ 2258 | "wit-bindgen-rt", 2259 | ] 2260 | 2261 | [[package]] 2262 | name = "wasite" 2263 | version = "0.1.0" 2264 | source = "registry+https://github.com/rust-lang/crates.io-index" 2265 | checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 2266 | 2267 | [[package]] 2268 | name = "wasm-bindgen" 2269 | version = "0.2.100" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2272 | dependencies = [ 2273 | "cfg-if", 2274 | "once_cell", 2275 | "wasm-bindgen-macro", 2276 | ] 2277 | 2278 | [[package]] 2279 | name = "wasm-bindgen-backend" 2280 | version = "0.2.100" 2281 | source = "registry+https://github.com/rust-lang/crates.io-index" 2282 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2283 | dependencies = [ 2284 | "bumpalo", 2285 | "log", 2286 | "proc-macro2", 2287 | "quote", 2288 | "syn", 2289 | "wasm-bindgen-shared", 2290 | ] 2291 | 2292 | [[package]] 2293 | name = "wasm-bindgen-macro" 2294 | version = "0.2.100" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2297 | dependencies = [ 2298 | "quote", 2299 | "wasm-bindgen-macro-support", 2300 | ] 2301 | 2302 | [[package]] 2303 | name = "wasm-bindgen-macro-support" 2304 | version = "0.2.100" 2305 | source = "registry+https://github.com/rust-lang/crates.io-index" 2306 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2307 | dependencies = [ 2308 | "proc-macro2", 2309 | "quote", 2310 | "syn", 2311 | "wasm-bindgen-backend", 2312 | "wasm-bindgen-shared", 2313 | ] 2314 | 2315 | [[package]] 2316 | name = "wasm-bindgen-shared" 2317 | version = "0.2.100" 2318 | source = "registry+https://github.com/rust-lang/crates.io-index" 2319 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2320 | dependencies = [ 2321 | "unicode-ident", 2322 | ] 2323 | 2324 | [[package]] 2325 | name = "web-sys" 2326 | version = "0.3.77" 2327 | source = "registry+https://github.com/rust-lang/crates.io-index" 2328 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 2329 | dependencies = [ 2330 | "js-sys", 2331 | "wasm-bindgen", 2332 | ] 2333 | 2334 | [[package]] 2335 | name = "whoami" 2336 | version = "1.5.2" 2337 | source = "registry+https://github.com/rust-lang/crates.io-index" 2338 | checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" 2339 | dependencies = [ 2340 | "redox_syscall", 2341 | "wasite", 2342 | "web-sys", 2343 | ] 2344 | 2345 | [[package]] 2346 | name = "winapi" 2347 | version = "0.3.9" 2348 | source = "registry+https://github.com/rust-lang/crates.io-index" 2349 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2350 | dependencies = [ 2351 | "winapi-i686-pc-windows-gnu", 2352 | "winapi-x86_64-pc-windows-gnu", 2353 | ] 2354 | 2355 | [[package]] 2356 | name = "winapi-i686-pc-windows-gnu" 2357 | version = "0.4.0" 2358 | source = "registry+https://github.com/rust-lang/crates.io-index" 2359 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2360 | 2361 | [[package]] 2362 | name = "winapi-util" 2363 | version = "0.1.9" 2364 | source = "registry+https://github.com/rust-lang/crates.io-index" 2365 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 2366 | dependencies = [ 2367 | "windows-sys 0.59.0", 2368 | ] 2369 | 2370 | [[package]] 2371 | name = "winapi-x86_64-pc-windows-gnu" 2372 | version = "0.4.0" 2373 | source = "registry+https://github.com/rust-lang/crates.io-index" 2374 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2375 | 2376 | [[package]] 2377 | name = "windows" 2378 | version = "0.52.0" 2379 | source = "registry+https://github.com/rust-lang/crates.io-index" 2380 | checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" 2381 | dependencies = [ 2382 | "windows-core", 2383 | "windows-targets", 2384 | ] 2385 | 2386 | [[package]] 2387 | name = "windows-core" 2388 | version = "0.52.0" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2391 | dependencies = [ 2392 | "windows-targets", 2393 | ] 2394 | 2395 | [[package]] 2396 | name = "windows-sys" 2397 | version = "0.52.0" 2398 | source = "registry+https://github.com/rust-lang/crates.io-index" 2399 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2400 | dependencies = [ 2401 | "windows-targets", 2402 | ] 2403 | 2404 | [[package]] 2405 | name = "windows-sys" 2406 | version = "0.59.0" 2407 | source = "registry+https://github.com/rust-lang/crates.io-index" 2408 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2409 | dependencies = [ 2410 | "windows-targets", 2411 | ] 2412 | 2413 | [[package]] 2414 | name = "windows-targets" 2415 | version = "0.52.6" 2416 | source = "registry+https://github.com/rust-lang/crates.io-index" 2417 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2418 | dependencies = [ 2419 | "windows_aarch64_gnullvm", 2420 | "windows_aarch64_msvc", 2421 | "windows_i686_gnu", 2422 | "windows_i686_gnullvm", 2423 | "windows_i686_msvc", 2424 | "windows_x86_64_gnu", 2425 | "windows_x86_64_gnullvm", 2426 | "windows_x86_64_msvc", 2427 | ] 2428 | 2429 | [[package]] 2430 | name = "windows_aarch64_gnullvm" 2431 | version = "0.52.6" 2432 | source = "registry+https://github.com/rust-lang/crates.io-index" 2433 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2434 | 2435 | [[package]] 2436 | name = "windows_aarch64_msvc" 2437 | version = "0.52.6" 2438 | source = "registry+https://github.com/rust-lang/crates.io-index" 2439 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2440 | 2441 | [[package]] 2442 | name = "windows_i686_gnu" 2443 | version = "0.52.6" 2444 | source = "registry+https://github.com/rust-lang/crates.io-index" 2445 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2446 | 2447 | [[package]] 2448 | name = "windows_i686_gnullvm" 2449 | version = "0.52.6" 2450 | source = "registry+https://github.com/rust-lang/crates.io-index" 2451 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2452 | 2453 | [[package]] 2454 | name = "windows_i686_msvc" 2455 | version = "0.52.6" 2456 | source = "registry+https://github.com/rust-lang/crates.io-index" 2457 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2458 | 2459 | [[package]] 2460 | name = "windows_x86_64_gnu" 2461 | version = "0.52.6" 2462 | source = "registry+https://github.com/rust-lang/crates.io-index" 2463 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2464 | 2465 | [[package]] 2466 | name = "windows_x86_64_gnullvm" 2467 | version = "0.52.6" 2468 | source = "registry+https://github.com/rust-lang/crates.io-index" 2469 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2470 | 2471 | [[package]] 2472 | name = "windows_x86_64_msvc" 2473 | version = "0.52.6" 2474 | source = "registry+https://github.com/rust-lang/crates.io-index" 2475 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2476 | 2477 | [[package]] 2478 | name = "winnow" 2479 | version = "0.7.0" 2480 | source = "registry+https://github.com/rust-lang/crates.io-index" 2481 | checksum = "7e49d2d35d3fad69b39b94139037ecfb4f359f08958b9c11e7315ce770462419" 2482 | dependencies = [ 2483 | "memchr", 2484 | ] 2485 | 2486 | [[package]] 2487 | name = "wit-bindgen-rt" 2488 | version = "0.33.0" 2489 | source = "registry+https://github.com/rust-lang/crates.io-index" 2490 | checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" 2491 | dependencies = [ 2492 | "bitflags", 2493 | ] 2494 | 2495 | [[package]] 2496 | name = "write16" 2497 | version = "1.0.0" 2498 | source = "registry+https://github.com/rust-lang/crates.io-index" 2499 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 2500 | 2501 | [[package]] 2502 | name = "writeable" 2503 | version = "0.5.5" 2504 | source = "registry+https://github.com/rust-lang/crates.io-index" 2505 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2506 | 2507 | [[package]] 2508 | name = "wyz" 2509 | version = "0.5.1" 2510 | source = "registry+https://github.com/rust-lang/crates.io-index" 2511 | checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" 2512 | dependencies = [ 2513 | "tap", 2514 | ] 2515 | 2516 | [[package]] 2517 | name = "yansi-term" 2518 | version = "0.1.2" 2519 | source = "registry+https://github.com/rust-lang/crates.io-index" 2520 | checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" 2521 | dependencies = [ 2522 | "winapi", 2523 | ] 2524 | 2525 | [[package]] 2526 | name = "yoke" 2527 | version = "0.7.5" 2528 | source = "registry+https://github.com/rust-lang/crates.io-index" 2529 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2530 | dependencies = [ 2531 | "serde", 2532 | "stable_deref_trait", 2533 | "yoke-derive", 2534 | "zerofrom", 2535 | ] 2536 | 2537 | [[package]] 2538 | name = "yoke-derive" 2539 | version = "0.7.5" 2540 | source = "registry+https://github.com/rust-lang/crates.io-index" 2541 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2542 | dependencies = [ 2543 | "proc-macro2", 2544 | "quote", 2545 | "syn", 2546 | "synstructure", 2547 | ] 2548 | 2549 | [[package]] 2550 | name = "zerocopy" 2551 | version = "0.7.35" 2552 | source = "registry+https://github.com/rust-lang/crates.io-index" 2553 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2554 | dependencies = [ 2555 | "byteorder", 2556 | "zerocopy-derive 0.7.35", 2557 | ] 2558 | 2559 | [[package]] 2560 | name = "zerocopy" 2561 | version = "0.8.14" 2562 | source = "registry+https://github.com/rust-lang/crates.io-index" 2563 | checksum = "a367f292d93d4eab890745e75a778da40909cab4d6ff8173693812f79c4a2468" 2564 | dependencies = [ 2565 | "zerocopy-derive 0.8.14", 2566 | ] 2567 | 2568 | [[package]] 2569 | name = "zerocopy-derive" 2570 | version = "0.7.35" 2571 | source = "registry+https://github.com/rust-lang/crates.io-index" 2572 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2573 | dependencies = [ 2574 | "proc-macro2", 2575 | "quote", 2576 | "syn", 2577 | ] 2578 | 2579 | [[package]] 2580 | name = "zerocopy-derive" 2581 | version = "0.8.14" 2582 | source = "registry+https://github.com/rust-lang/crates.io-index" 2583 | checksum = "d3931cb58c62c13adec22e38686b559c86a30565e16ad6e8510a337cedc611e1" 2584 | dependencies = [ 2585 | "proc-macro2", 2586 | "quote", 2587 | "syn", 2588 | ] 2589 | 2590 | [[package]] 2591 | name = "zerofrom" 2592 | version = "0.1.5" 2593 | source = "registry+https://github.com/rust-lang/crates.io-index" 2594 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 2595 | dependencies = [ 2596 | "zerofrom-derive", 2597 | ] 2598 | 2599 | [[package]] 2600 | name = "zerofrom-derive" 2601 | version = "0.1.5" 2602 | source = "registry+https://github.com/rust-lang/crates.io-index" 2603 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 2604 | dependencies = [ 2605 | "proc-macro2", 2606 | "quote", 2607 | "syn", 2608 | "synstructure", 2609 | ] 2610 | 2611 | [[package]] 2612 | name = "zerovec" 2613 | version = "0.10.4" 2614 | source = "registry+https://github.com/rust-lang/crates.io-index" 2615 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2616 | dependencies = [ 2617 | "yoke", 2618 | "zerofrom", 2619 | "zerovec-derive", 2620 | ] 2621 | 2622 | [[package]] 2623 | name = "zerovec-derive" 2624 | version = "0.10.3" 2625 | source = "registry+https://github.com/rust-lang/crates.io-index" 2626 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2627 | dependencies = [ 2628 | "proc-macro2", 2629 | "quote", 2630 | "syn", 2631 | ] 2632 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "pg_jsonschema" 3 | version = "0.3.3" 4 | edition = "2021" 5 | 6 | [lib] 7 | crate-type = ["cdylib", "lib"] 8 | 9 | [[bin]] 10 | name = "pgrx_embed_pg_jsonschema" 11 | path = "./src/bin/pgrx_embed.rs" 12 | 13 | [features] 14 | default = ["pg16"] 15 | pg12 = ["pgrx/pg12", "pgrx-tests/pg12" ] 16 | pg13 = ["pgrx/pg13", "pgrx-tests/pg13" ] 17 | pg14 = ["pgrx/pg14", "pgrx-tests/pg14" ] 18 | pg15 = ["pgrx/pg15", "pgrx-tests/pg15" ] 19 | pg16 = ["pgrx/pg16", "pgrx-tests/pg16" ] 20 | pg17 = ["pgrx/pg17", "pgrx-tests/pg17" ] 21 | pg_test = [] 22 | 23 | [dependencies] 24 | pgrx = "0.12.9" 25 | serde = "1.0" 26 | serde_json = "1.0" 27 | jsonschema = {version = "0.28.0", default-features = false} 28 | 29 | [dev-dependencies] 30 | pgrx-tests = "0.12.9" 31 | 32 | [profile.dev] 33 | panic = "unwind" 34 | lto = "thin" 35 | 36 | [profile.release] 37 | panic = "unwind" 38 | opt-level = 3 39 | lto = "fat" 40 | codegen-units = 1 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | Copyright 2022 Supabase 179 | 180 | Licensed under the Apache License, Version 2.0 (the "License"); 181 | you may not use this file except in compliance with the License. 182 | You may obtain a copy of the License at 183 | 184 | http://www.apache.org/licenses/LICENSE-2.0 185 | 186 | Unless required by applicable law or agreed to in writing, software 187 | distributed under the License is distributed on an "AS IS" BASIS, 188 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 189 | See the License for the specific language governing permissions and 190 | limitations under the License. 191 | -------------------------------------------------------------------------------- /META.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pg_jsonschema", 3 | "abstract": "PostgreSQL extension providing JSON Schema validation", 4 | "description": "pg_jsonschema is a PostgreSQL extension adding support for JSON schema validation on json and jsonb data types.", 5 | "version": "0.3.1", 6 | "maintainer": [ 7 | "Oliver Rice " 8 | ], 9 | "license": "apache_2_0", 10 | "provides": { 11 | "pg_jsonschema": { 12 | "abstract": "PostgreSQL extension providing JSON Schema validation", 13 | "file": "pg_jsonschema.control", 14 | "docfile": "README.md", 15 | "version": "0.3.1" 16 | } 17 | }, 18 | "prereqs": { 19 | "runtime": { 20 | "requires": { 21 | "PostgreSQL": "12.0.0" 22 | } 23 | } 24 | }, 25 | "resources": { 26 | "bugtracker": { 27 | "web": "https://github.com/supabase/pg_jsonschema/issues/" 28 | }, 29 | "repository": { 30 | "url": "git://github.com/supabase/pg_jsonschema.git", 31 | "web": "https://github.com/supabase/pg_jsonschema/", 32 | "type": "git" 33 | } 34 | }, 35 | "generated_by": "David E. Wheeler", 36 | "meta-spec": { 37 | "version": "1.0.0", 38 | "url": "https://pgxn.org/meta/spec.txt" 39 | }, 40 | "tags": [ 41 | "jsonschema", 42 | "validation", 43 | "json", 44 | "jsonb" 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pg_jsonschema 2 | 3 |

4 | PostgreSQL version 5 | License 6 | 7 |

8 | 9 | --- 10 | 11 | **Source Code**: https://github.com/supabase/pg_jsonschema 12 | 13 | --- 14 | 15 | ## Summary 16 | 17 | `pg_jsonschema` is a PostgreSQL extension adding support for [JSON schema](https://json-schema.org/) validation on `json` and `jsonb` data types. 18 | 19 | 20 | ## API 21 | Three SQL functions: 22 | - json_matches_schema 23 | - jsonb_matches_schema (note the **jsonb** in front) 24 | - jsonschema_is_valid 25 | 26 | With the following signatures 27 | ```sql 28 | -- Validates a json *instance* against a *schema* 29 | json_matches_schema(schema json, instance json) returns bool 30 | ``` 31 | and 32 | ```sql 33 | -- Validates a jsonb *instance* against a *schema* 34 | jsonb_matches_schema(schema json, instance jsonb) returns bool 35 | ``` 36 | and 37 | ```sql 38 | -- Validates whether a json *schema* is valid 39 | jsonschema_is_valid(schema json) returns bool 40 | ``` 41 | 42 | ## Usage 43 | Those functions can be used to constrain `json` and `jsonb` columns to conform to a schema. 44 | 45 | For example: 46 | ```sql 47 | create extension pg_jsonschema; 48 | 49 | create table customer( 50 | id serial primary key, 51 | metadata json, 52 | 53 | check ( 54 | json_matches_schema( 55 | '{ 56 | "type": "object", 57 | "properties": { 58 | "tags": { 59 | "type": "array", 60 | "items": { 61 | "type": "string", 62 | "maxLength": 16 63 | } 64 | } 65 | } 66 | }', 67 | metadata 68 | ) 69 | ) 70 | ); 71 | 72 | -- Example: Valid Payload 73 | insert into customer(metadata) 74 | values ('{"tags": ["vip", "darkmode-ui"]}'); 75 | -- Result: 76 | -- INSERT 0 1 77 | 78 | -- Example: Invalid Payload 79 | insert into customer(metadata) 80 | values ('{"tags": [1, 3]}'); 81 | -- Result: 82 | -- ERROR: new row for relation "customer" violates check constraint "customer_metadata_check" 83 | -- DETAIL: Failing row contains (2, {"tags": [1, 3]}). 84 | ``` 85 | 86 | ## JSON Schema Support 87 | 88 | pg_jsonschema is a (very) thin wrapper around the [jsonschema](https://docs.rs/jsonschema/latest/jsonschema/) rust crate. Visit their docs for full details on which drafts of the JSON Schema spec are supported. 89 | 90 | ## Try it Out 91 | 92 | Spin up Postgres with pg_jsonschema installed in a docker container via `docker-compose up`. The database is available at `postgresql://postgres:password@localhost:5407/app` 93 | 94 | 95 | ## Installation 96 | 97 | 98 | Requires: 99 | - [pgrx](https://github.com/tcdi/pgrx) 100 | 101 | 102 | ```shell 103 | cargo pgrx run 104 | ``` 105 | 106 | which drops into a psql prompt. 107 | ```psql 108 | psql (13.6) 109 | Type "help" for help. 110 | 111 | pg_jsonschema=# create extension pg_jsonschema; 112 | CREATE EXTENSION 113 | 114 | pg_jsonschema=# select json_matches_schema('{"type": "object"}', '{}'); 115 | json_matches_schema 116 | --------------------- 117 | t 118 | (1 row) 119 | ``` 120 | 121 | for more complete installation guidelines see the [pgrx](https://github.com/tcdi/pgrx) docs. 122 | 123 | 124 | ## Prior Art 125 | 126 | [postgres-json-schema](https://github.com/gavinwahl/postgres-json-schema) - JSON Schema Postgres extension written in PL/pgSQL 127 | 128 | [is_jsonb_valid](https://github.com/furstenheim/is_jsonb_valid) - JSON Schema Postgres extension written in C 129 | 130 | [pgx_json_schema](https://github.com/jefbarn/pgx_json_schema) - JSON Schema Postgres extension written with pgrx + jsonschema 131 | 132 | 133 | ## Benchmark 134 | 135 | 136 | #### System 137 | - 2021 MacBook Pro M1 Max (32GB) 138 | - macOS 14.2 139 | - PostgreSQL 16.2 140 | 141 | ### Setup 142 | Validating the following schema on 20k unique inserts 143 | 144 | ```json 145 | { 146 | "type": "object", 147 | "properties": { 148 | "a": {"type": "number"}, 149 | "b": {"type": "string"} 150 | } 151 | } 152 | ``` 153 | 154 | ```sql 155 | create table bench_test_pg_jsonschema( 156 | meta jsonb, 157 | check ( 158 | jsonb_matches_schema( 159 | '{"type": "object", "properties": {"a": {"type": "number"}, "b": {"type": "string"}}}', 160 | meta 161 | ) 162 | ) 163 | ); 164 | 165 | insert into bench_test_pg_jsonschema(meta) 166 | select 167 | json_build_object( 168 | 'a', i, 169 | 'b', i::text 170 | ) 171 | from 172 | generate_series(1, 20000) t(i); 173 | -- Query Completed in 351 ms 174 | ``` 175 | for comparison, the equivalent test using postgres-json-schema's `validate_json_schema` function ran in 5.54 seconds. pg_jsonschema's ~15x speedup on this example JSON schema grows quickly as the schema becomes more complex. 176 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | 4 | db: 5 | container_name: pg_jsonschema_db 6 | build: 7 | context: . 8 | dockerfile: ./dockerfiles/db/Dockerfile 9 | ports: 10 | - 5407:5432 11 | healthcheck: 12 | test: ["CMD-SHELL", "PGUSER=postgres", "pg_isready"] 13 | interval: 1s 14 | timeout: 10s 15 | retries: 5 16 | environment: 17 | POSTGRES_USER: postgres 18 | POSTGRES_PASSWORD: password 19 | POSTGRES_DB: app 20 | -------------------------------------------------------------------------------- /dockerfiles/db/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM postgres:16 2 | RUN apt-get update 3 | 4 | ENV build_deps ca-certificates \ 5 | git \ 6 | build-essential \ 7 | libpq-dev \ 8 | postgresql-server-dev-16 \ 9 | curl \ 10 | libreadline6-dev \ 11 | zlib1g-dev 12 | 13 | 14 | RUN apt-get install -y --no-install-recommends $build_deps pkg-config cmake 15 | 16 | WORKDIR /home/supa 17 | 18 | ENV HOME=/home/supa \ 19 | PATH=/home/supa/.cargo/bin:$PATH 20 | RUN chown postgres:postgres /home/supa 21 | USER postgres 22 | 23 | RUN \ 24 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --profile minimal --default-toolchain stable && \ 25 | rustup --version && \ 26 | rustc --version && \ 27 | cargo --version 28 | 29 | # PGX 30 | RUN cargo install cargo-pgrx --version 0.12.9 --locked 31 | 32 | RUN cargo pgrx init --pg16 $(which pg_config) 33 | 34 | USER root 35 | 36 | COPY . . 37 | RUN cargo pgrx install 38 | 39 | RUN chown -R postgres:postgres /home/supa 40 | RUN chown -R postgres:postgres /usr/share/postgresql/16/extension 41 | RUN chown -R postgres:postgres /usr/lib/postgresql/16/lib 42 | 43 | USER postgres 44 | -------------------------------------------------------------------------------- /pg_jsonschema.control: -------------------------------------------------------------------------------- 1 | comment = 'pg_jsonschema' 2 | default_version = '@CARGO_VERSION@' 3 | module_pathname = '$libdir/pg_jsonschema' 4 | relocatable = false 5 | superuser = true 6 | -------------------------------------------------------------------------------- /src/bin/pgrx_embed.rs: -------------------------------------------------------------------------------- 1 | ::pgrx::pgrx_embed!(); -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use pgrx::*; 2 | 3 | pg_module_magic!(); 4 | 5 | #[pg_extern(immutable, strict, parallel_safe)] 6 | fn json_matches_schema(schema: Json, instance: Json) -> bool { 7 | jsonschema::is_valid(&schema.0, &instance.0) 8 | } 9 | 10 | #[pg_extern(immutable, strict, parallel_safe)] 11 | fn jsonb_matches_schema(schema: Json, instance: JsonB) -> bool { 12 | jsonschema::is_valid(&schema.0, &instance.0) 13 | } 14 | 15 | #[pg_extern(immutable, strict, parallel_safe)] 16 | fn jsonschema_is_valid(schema: Json) -> bool { 17 | match jsonschema::meta::try_validate(&schema.0) { 18 | Ok(Ok(_)) => true, 19 | Ok(Err(err)) => { 20 | notice!("Invalid JSON schema at path: {}", err.instance_path); 21 | false 22 | } 23 | Err(err) => { 24 | notice!("{err}"); 25 | false 26 | } 27 | } 28 | } 29 | 30 | #[pg_extern(immutable, strict, parallel_safe)] 31 | fn jsonschema_validation_errors(schema: Json, instance: Json) -> Vec { 32 | let validator = match jsonschema::validator_for(&schema.0) { 33 | Ok(v) => v, 34 | Err(err) => return vec![err.to_string()], 35 | }; 36 | validator 37 | .iter_errors(&instance.0) 38 | .map(|err| err.to_string()) 39 | .collect() 40 | } 41 | 42 | #[pg_schema] 43 | #[cfg(any(test, feature = "pg_test"))] 44 | mod tests { 45 | use pgrx::*; 46 | use serde_json::json; 47 | 48 | #[pg_test] 49 | fn test_json_matches_schema_rs() { 50 | let max_length: i32 = 5; 51 | assert!(crate::json_matches_schema( 52 | Json(json!({ "maxLength": max_length })), 53 | Json(json!("foo")), 54 | )); 55 | } 56 | 57 | #[pg_test] 58 | fn test_json_not_matches_schema_rs() { 59 | let max_length: i32 = 5; 60 | assert!(!crate::json_matches_schema( 61 | Json(json!({ "maxLength": max_length })), 62 | Json(json!("foobar")), 63 | )); 64 | } 65 | 66 | #[pg_test] 67 | fn test_jsonb_matches_schema_rs() { 68 | let max_length: i32 = 5; 69 | assert!(crate::jsonb_matches_schema( 70 | Json(json!({ "maxLength": max_length })), 71 | JsonB(json!("foo")), 72 | )); 73 | } 74 | 75 | #[pg_test] 76 | fn test_jsonb_not_matches_schema_rs() { 77 | let max_length: i32 = 5; 78 | assert!(!crate::jsonb_matches_schema( 79 | Json(json!({ "maxLength": max_length })), 80 | JsonB(json!("foobar")), 81 | )); 82 | } 83 | 84 | #[pg_test] 85 | fn test_json_matches_schema_spi() { 86 | let result = Spi::get_one::( 87 | r#" 88 | select json_matches_schema('{"type": "object"}', '{}') 89 | "#, 90 | ) 91 | .unwrap() 92 | .unwrap(); 93 | assert!(result); 94 | } 95 | 96 | #[pg_test] 97 | fn test_json_not_matches_schema_spi() { 98 | let result = Spi::get_one::( 99 | r#" 100 | select json_matches_schema('{"type": "object"}', '1') 101 | "#, 102 | ) 103 | .unwrap() 104 | .unwrap(); 105 | assert!(!result); 106 | } 107 | 108 | #[pg_test] 109 | fn test_jsonb_matches_schema_spi() { 110 | let result = Spi::get_one::( 111 | r#" 112 | select jsonb_matches_schema('{"type": "object"}', '{}') 113 | "#, 114 | ) 115 | .unwrap() 116 | .unwrap(); 117 | assert!(result); 118 | } 119 | 120 | #[pg_test] 121 | fn test_jsonb_not_matches_schema_spi() { 122 | let result = Spi::get_one::( 123 | r#" 124 | select jsonb_matches_schema('{"type": "object"}', '1') 125 | "#, 126 | ) 127 | .unwrap() 128 | .unwrap(); 129 | assert!(!result); 130 | } 131 | 132 | #[pg_test] 133 | fn test_jsonschema_is_valid() { 134 | assert!(crate::jsonschema_is_valid(Json(json!({ 135 | "type": "object" 136 | })))); 137 | } 138 | 139 | #[pg_test] 140 | fn test_jsonschema_is_not_valid() { 141 | assert!(!crate::jsonschema_is_valid(Json(json!({ 142 | "type": "obj" 143 | })))); 144 | } 145 | 146 | #[pg_test] 147 | fn test_jsonschema_unknown_specification() { 148 | assert!(!crate::jsonschema_is_valid(Json(json!({ 149 | "$schema": "invalid-uri", "type": "string" 150 | })))); 151 | } 152 | 153 | #[pg_test] 154 | fn test_jsonschema_validation_errors_none() { 155 | let errors = crate::jsonschema_validation_errors( 156 | Json(json!({ "maxLength": 4 })), 157 | Json(json!("foo")), 158 | ); 159 | assert!(errors.is_empty()); 160 | } 161 | 162 | #[pg_test] 163 | fn test_jsonschema_validation_erros_one() { 164 | let errors = crate::jsonschema_validation_errors( 165 | Json(json!({ "maxLength": 4 })), 166 | Json(json!("123456789")), 167 | ); 168 | assert!(errors.len() == 1); 169 | assert!(errors[0] == *"\"123456789\" is longer than 4 characters"); 170 | } 171 | 172 | #[pg_test] 173 | fn test_jsonschema_validation_errors_multiple() { 174 | let errors = crate::jsonschema_validation_errors( 175 | Json(json!( 176 | { 177 | "type": "object", 178 | "properties": { 179 | "foo": { 180 | "type": "string" 181 | }, 182 | "bar": { 183 | "type": "number" 184 | }, 185 | "baz": { 186 | "type": "boolean" 187 | }, 188 | "additionalProperties": false, 189 | } 190 | })), 191 | Json(json!({"foo": 1, "bar": [], "baz": "1"})), 192 | ); 193 | 194 | assert!(errors.len() == 3); 195 | assert!(errors[0] == *"[] is not of type \"number\""); 196 | assert!(errors[1] == *"\"1\" is not of type \"boolean\""); 197 | assert!(errors[2] == *"1 is not of type \"string\""); 198 | } 199 | } 200 | 201 | #[cfg(test)] 202 | pub mod pg_test { 203 | pub fn setup(_options: Vec<&str>) { 204 | // perform one-off initialization when the pg_test framework starts 205 | } 206 | 207 | pub fn postgresql_conf_options() -> Vec<&'static str> { 208 | // return any postgresql.conf settings that are required for your tests 209 | vec![] 210 | } 211 | } 212 | --------------------------------------------------------------------------------