diff --git a/Cargo.lock b/Cargo.lock index 0e2b1f7..1c1ed48 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,331 +1,396 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "addr2line" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" + [[package]] name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi", ] [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi", + "libc", + "winapi", ] [[package]] -name = "backtrace" -version = "0.3.46" +name = "autocfg" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace-sys 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", -] +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] -name = "backtrace-sys" -version = "0.1.36" +name = "backtrace" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46254cf2fdcdf1badb5934448c1bcbe046a56537b3987d96c51a7afc5d03f293" dependencies = [ - "cc 1.0.52 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", ] [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "bsv" version = "0.1.0" dependencies = [ - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hostname 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "clap", + "error-chain", + "hostname", + "libbsv", ] -[[package]] -name = "cc" -version = "1.0.52" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "clap" -version = "2.33.0" +version = "2.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" dependencies = [ - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", ] [[package]] name = "error-chain" -version = "0.12.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" dependencies = [ - "backtrace 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace", + "version_check", ] [[package]] name = "getrandom" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] +[[package]] +name = "gimli" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" + [[package]] name = "hermit-abi" -version = "0.1.12" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" dependencies = [ - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "hostname" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" dependencies = [ - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "match_cfg 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "match_cfg", + "winapi", +] + +[[package]] +name = "libbsv" +version = "0.1.0" +dependencies = [ + "error-chain", + "serde", + "tempfile", + "toml", + "uuid", ] [[package]] name = "libc" -version = "0.2.69" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f96b10ec2560088a8e76961b00d47107b3a625fecb76dedb29ee7ccbf98235" [[package]] name = "match_cfg" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "miniz_oxide" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c60c0dfe32c10b43a144bad8fc83538c52f58302c92300ea7ec7bf7b38d5a7b9" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "object" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab52be62400ca80aa00285d25253d7f7c437b7375c4de678f5405d3afe82ca5" [[package]] name = "ppv-lite86" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c36fa947111f5c62a733b652544dd0016a43ce89619538a8ef92724a6f501a20" [[package]] name = "proc-macro2" -version = "1.0.10" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36e28516df94f3dd551a587da5357459d9b36d945a7c37c3557928c1c2ff2a2c" dependencies = [ - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid", ] [[package]] name = "quote" -version = "1.0.3" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" dependencies = [ - "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", ] [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] name = "rand_chacha" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ - "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", ] [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", ] [[package]] name = "rustc-demangle" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" [[package]] name = "serde" -version = "1.0.106" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96fe57af81d28386a513cbc6858332abc6117cfdb5999647c6444b8f43a370a5" dependencies = [ - "serde_derive 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.106" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f630a6370fd8e457873b4bd2ffdae75408bc291ba72be773772a4c2a065d9ae8" dependencies = [ - "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "strsim" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "syn" -version = "1.0.18" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6690e3e9f692504b941dc6c3b188fd28df054f7fb8469ab40680df52fdcc842b" dependencies = [ - "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +dependencies = [ + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi", ] [[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width", ] [[package]] name = "toml" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" dependencies = [ - "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "unicode-width" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "unicode-xid" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" [[package]] name = "uuid" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" dependencies = [ - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", + "serde", ] [[package]] name = "vec_map" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "winapi" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -"checksum backtrace 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)" = "b1e692897359247cc6bb902933361652380af0f1b7651ae5c5013407f30e109e" -"checksum backtrace-sys 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "78848718ee1255a2485d1309ad9cdecfc2e7d0362dd11c6829364c6b35ae1bc7" -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum cc 1.0.52 (registry+https://github.com/rust-lang/crates.io-index)" = "c3d87b23d6a92cd03af510a5ade527033f6aa6fa92161e2d5863a907d4c5e31d" -"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" -"checksum error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" -"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" -"checksum hermit-abi 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "61565ff7aaace3525556587bd2dc31d4a07071957be715e63ce7b1eccf51a8f4" -"checksum hostname 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -"checksum libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)" = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" -"checksum match_cfg 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" -"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" -"checksum proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3" -"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" -"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -"checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" -"checksum serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)" = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399" -"checksum serde_derive 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)" = "9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c" -"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" -"checksum syn 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "410a7488c0a728c7ceb4ad59b9567eb4053d02e8cc7f5c0e0eeeb39518369213" -"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -"checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" -"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" -"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" -"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" -"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" -"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml index 136fda5..168cf3e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,14 +1,6 @@ -[package] -name = "bsv" -version = "0.1.0" -authors = ["Simon Boyé "] -edition = "2018" -license = "AGPL-3.0-or-later" +[workspace] -[dependencies] -error-chain = "0.12.2" -serde = "1.0.106" -toml = "0.5.6" -clap = "2.33.0" -uuid = { version = "0.8.1", features = ["serde", "v4"] } -hostname = "0.3.1" +members = [ + "libbsv", + "bsv", +] diff --git a/bsv/.gitignore b/bsv/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/bsv/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/bsv/Cargo.toml b/bsv/Cargo.toml new file mode 100644 index 0000000..7987315 --- /dev/null +++ b/bsv/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "bsv" +version = "0.1.0" +authors = ["Simon Boyé "] +edition = "2018" +license = "AGPL-3.0-or-later" + +[dependencies] +error-chain = "0.12.2" +clap = "2.33.3" +hostname = "0.3.1" +libbsv = { path = "../libbsv" } diff --git a/src/commands/command.rs b/bsv/src/commands/command.rs similarity index 98% rename from src/commands/command.rs rename to bsv/src/commands/command.rs index 908a29d..6b450de 100644 --- a/src/commands/command.rs +++ b/bsv/src/commands/command.rs @@ -18,7 +18,7 @@ use std::collections::{hash_map, HashMap}; use clap::{App, ArgMatches}; -use crate::core::error::*; +use libbsv::core::error::*; pub trait Command { diff --git a/src/commands/init.rs b/bsv/src/commands/init.rs similarity index 97% rename from src/commands/init.rs rename to bsv/src/commands/init.rs index f8a2079..d4cb00c 100644 --- a/src/commands/init.rs +++ b/bsv/src/commands/init.rs @@ -18,8 +18,8 @@ use std::path::PathBuf; use clap::{App, Arg, ArgMatches, SubCommand}; -use crate::core::error::*; -use crate::core::repository::Repository; +use libbsv::core::error::*; +use libbsv::core::repository::Repository; use super::command::Command; diff --git a/src/commands/mod.rs b/bsv/src/commands/mod.rs similarity index 100% rename from src/commands/mod.rs rename to bsv/src/commands/mod.rs diff --git a/src/main.rs b/bsv/src/main.rs similarity index 92% rename from src/main.rs rename to bsv/src/main.rs index b9c07c4..1b90ea5 100644 --- a/src/main.rs +++ b/bsv/src/main.rs @@ -17,22 +17,23 @@ #[macro_use] extern crate error_chain; +extern crate libbsv; + -mod core; mod commands; use clap::{Arg, App, AppSettings}; -use crate::core::error::*; +use libbsv::core::error::*; use crate::commands::default_command_map; fn run() -> Result<()> { let command_map = default_command_map(); - let app = App::new(core::NAME) - .version(core::VERSION) + let app = App::new(libbsv::core::NAME) + .version(libbsv::core::VERSION) .author("Simon Boyé ") .about("Backup, synchronize and versionize your data.") .setting(AppSettings::SubcommandRequired) diff --git a/libbsv/.gitignore b/libbsv/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/libbsv/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/libbsv/Cargo.toml b/libbsv/Cargo.toml new file mode 100644 index 0000000..e12d902 --- /dev/null +++ b/libbsv/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "libbsv" +version = "0.1.0" +authors = ["Simon Boyé "] +edition = "2018" +license = "AGPL-3.0-or-later" + +[dependencies] +error-chain = "0.12.2" +serde = "1.0.106" +toml = "0.5.6" +uuid = { version = "0.8.1", features = ["serde", "v4"] } +tempfile = "3.1.0" diff --git a/libbsv/src/core/config.rs b/libbsv/src/core/config.rs new file mode 100644 index 0000000..9200afc --- /dev/null +++ b/libbsv/src/core/config.rs @@ -0,0 +1,34 @@ +// This file is part of bsv. +// +// bsv is free software: you can redistribute it and/or modify it under the +// terms of the GNU Affero General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) +// any later version. +// +// cdb is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for +// more details. +// +// You should have received a copy of the Affero GNU General Public License +// along with cdb. If not, see . + + +use std::path::PathBuf; + +use uuid::Uuid; +use serde::{Serialize, Deserialize}; + + +#[derive(Debug, Serialize, Deserialize)] +pub struct RepositoryConfig { + pub path: PathBuf, + pub device_name: String, + pub uuid: Uuid, +} + + +#[derive(Debug, Serialize, Deserialize)] +pub struct Config { + pub repository: RepositoryConfig, +} diff --git a/src/core/error.rs b/libbsv/src/core/error.rs similarity index 73% rename from src/core/error.rs rename to libbsv/src/core/error.rs index e72c08d..28aef9b 100644 --- a/src/core/error.rs +++ b/libbsv/src/core/error.rs @@ -30,7 +30,17 @@ error_chain! { NonEmptyDirectory(dir: PathBuf) { description("Non-empty directory") - display("Target directory {:?} must be empty", dir) + display("Target directory {:?} must be empty.", dir) + } + + InvalidObjectIdSize { + description("Object id has an invalid size") + display("Object id has an invalid size.") + } + + InvalidObjectIdCharacter { + description("Object id contains invalid character") + display("Object id contains invalid character") } } } diff --git a/src/core/mod.rs b/libbsv/src/core/mod.rs similarity index 83% rename from src/core/mod.rs rename to libbsv/src/core/mod.rs index a712c8e..ddeb885 100644 --- a/src/core/mod.rs +++ b/libbsv/src/core/mod.rs @@ -15,8 +15,16 @@ pub mod error; +pub mod config; +pub mod object_id; pub mod repository; pub const NAME: &'static str = env!("CARGO_PKG_NAME"); pub const VERSION: &'static str = env!("CARGO_PKG_VERSION"); + + +pub use error::Error; +pub use config::{Config, RepositoryConfig}; +pub use object_id::ObjectId; +pub use repository::Repository; diff --git a/libbsv/src/core/object_id.rs b/libbsv/src/core/object_id.rs new file mode 100644 index 0000000..4f13b25 --- /dev/null +++ b/libbsv/src/core/object_id.rs @@ -0,0 +1,110 @@ +// This file is part of bsv. +// +// bsv is free software: you can redistribute it and/or modify it under the +// terms of the GNU Affero General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) +// any later version. +// +// cdb is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for +// more details. +// +// You should have received a copy of the Affero GNU General Public License +// along with cdb. If not, see . + + +use std::fmt; + +use super::error::*; + + +/// A unique identifier for an object. +/// +/// This is the handle used to referenc an Object. This is an opaque type that uniquely identify an +/// object. It can be compared to another ObjectId, be hashed and that's about it. +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct ObjectId { + id: Vec, +} + + +impl ObjectId { + pub fn new(id: Vec) -> ObjectId { + ObjectId { + id + } + } + + pub fn from_str(id_str: &str) -> Result { + if id_str.len() % 2 != 0 { + return Err(ErrorKind::InvalidObjectIdSize.into()); + } + + let byte_count = id_str.len() / 2; + let mut id = Vec::with_capacity(byte_count); + + for byte_index in 0..byte_count { + let str_index = byte_index * 2; + let byte_str = id_str.get(str_index..(str_index + 2)) + .ok_or(ErrorKind::InvalidObjectIdCharacter)?; + id.push(u8::from_str_radix(byte_str, 16) + .or(Err(ErrorKind::InvalidObjectIdCharacter))?); + } + + Ok(ObjectId { + id + }) + } +} + + +impl fmt::Display for ObjectId { + fn fmt(&self, f: &mut fmt::Formatter) -> std::result::Result<(), fmt::Error> { + for byte in self.id.iter() { + write!(f, "{:02x}", byte)?; + } + Ok(()) + } +} + + +impl fmt::Debug for ObjectId { + fn fmt(&self, f: &mut fmt::Formatter) -> std::result::Result<(), fmt::Error> { + write!(f, "ObjectId::new(\"{}\")", self) + } +} + + +#[cfg(test)] +mod tests { + use super::ObjectId; + + #[test] + fn object_id_display() { + let obj = ObjectId::new(vec![ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + ]); + + assert_eq!(format!("{}", obj), "0001020304050607"); + } + + #[test] + fn object_id_debug() { + let obj = ObjectId::new(vec![ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + ]); + + assert_eq!(format!("{:?}", obj), "ObjectId::new(\"0001020304050607\")"); + } + + #[test] + fn str_to_object_id() { + let obj = ObjectId::from_str("0001020304050607").unwrap(); + let obj_ref = ObjectId::new(vec![ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + ]); + + assert_eq!(obj, obj_ref); + } +} diff --git a/src/core/repository.rs b/libbsv/src/core/repository.rs similarity index 72% rename from src/core/repository.rs rename to libbsv/src/core/repository.rs index d20b6ae..ca5d4ea 100644 --- a/src/core/repository.rs +++ b/libbsv/src/core/repository.rs @@ -16,21 +16,23 @@ use std::path::{Path, PathBuf}; use std::fs::{self, create_dir}; +use std::rc::Rc; use uuid::Uuid; -use serde::{Serialize, Deserialize}; -use crate::core::error::*; +use super::error::*; +use super::config::{Config, RepositoryConfig}; + +use crate::simple_db::SimpleDb; const CONFIG_FILENAME: &'static str = ".bsv"; -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug)] pub struct Repository { - path: PathBuf, - device_name: String, - uuid: Uuid, + config: Rc, + db: SimpleDb, } @@ -46,11 +48,15 @@ impl Repository { create_dir(&path).chain_err(|| "Failed to create repository.")?; - let repository = Repository { - path: path.into(), - device_name: device_name.into(), - uuid: Uuid::new_v4(), - }; + let config = Rc::new( + Config { + repository: RepositoryConfig { + path: path.into(), + device_name: device_name.into(), + uuid: Uuid::new_v4(), + }, + } + ); let config_path = { let mut config_path = PathBuf::from(path); @@ -60,12 +66,15 @@ impl Repository { fs::write( config_path, - toml::to_string(&repository) + toml::to_string(&*config) .chain_err(|| format!("Failed to serialize {}.", CONFIG_FILENAME))?, ).chain_err(|| format!("Failed to create repository: failed to write {}.", CONFIG_FILENAME) )?; - Ok(repository) + Ok(Repository { + config: Rc::clone(&config), + db: SimpleDb::new(path.into())?, + }) } } diff --git a/libbsv/src/lib.rs b/libbsv/src/lib.rs new file mode 100644 index 0000000..6f10920 --- /dev/null +++ b/libbsv/src/lib.rs @@ -0,0 +1,32 @@ +// This file is part of bsv. +// +// bsv is free software: you can redistribute it and/or modify it under the +// terms of the GNU Affero General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) +// any later version. +// +// cdb is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for +// more details. +// +// You should have received a copy of the Affero GNU General Public License +// along with cdb. If not, see . + + +#[macro_use] +extern crate error_chain; + + +pub mod core; +pub mod simple_db; + + +pub use crate::core::{ + Error, + Config, RepositoryConfig, + ObjectId, + Repository, +}; + +pub use crate::simple_db::SimpleDb; diff --git a/libbsv/src/simple_db/mod.rs b/libbsv/src/simple_db/mod.rs new file mode 100644 index 0000000..1502e9a --- /dev/null +++ b/libbsv/src/simple_db/mod.rs @@ -0,0 +1,76 @@ +// This file is part of bsv. +// +// bsv is free software: you can redistribute it and/or modify it under the +// terms of the GNU Affero General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) +// any later version. +// +// cdb is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for +// more details. +// +// You should have received a copy of the Affero GNU General Public License +// along with cdb. If not, see . + + +use std::path::{Path, PathBuf}; + +use crate::core::error::*; +use crate::core::object_id::ObjectId; + + +const OBJECTS_FOLDER: &str = "objects"; + + +#[derive(Debug)] +pub struct SimpleDb { + path: PathBuf, +} + + +impl SimpleDb { + pub fn new(path: &Path) -> Result { + Ok(SimpleDb { + path: path.into(), + }) + } + + + pub fn has_object(&self, oid: &ObjectId) -> bool { + let obj_path = self.path_from_id(oid); + if let Ok(metadata) = std::fs::metadata(obj_path) { + metadata.is_file() + } + else { + false + } + } + + fn path_from_id(&self, oid: &ObjectId) -> PathBuf { + let oid_str = oid.to_string(); + let mut path = self.path.clone(); + + path.push(OBJECTS_FOLDER); + path.push(oid_str.get(..4).unwrap()); // unwrap is ok here because we know oid_str is a + path.push(oid_str.get(4..).unwrap()); // hexadecimal number (i.e. ascii only). + + path + } +} + + +#[cfg(test)] +mod tests { + use super::ObjectId; + use super::SimpleDb; + + #[test] + fn simple_db_path_from_id() { + let db = SimpleDb::new(std::path::Path::new(".bsv")).unwrap(); + let oid = ObjectId::from_str("0001020304050607").unwrap(); + + let path = db.path_from_id(&oid); + assert_eq!(path, std::path::PathBuf::from(".bsv/objects/0001/020304050607")); + } +} diff --git a/libbsv/tests/simple_db.rs b/libbsv/tests/simple_db.rs new file mode 100644 index 0000000..c973c5a --- /dev/null +++ b/libbsv/tests/simple_db.rs @@ -0,0 +1,40 @@ +// This file is part of bsv. +// +// bsv is free software: you can redistribute it and/or modify it under the +// terms of the GNU Affero General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) +// any later version. +// +// cdb is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for +// more details. +// +// You should have received a copy of the Affero GNU General Public License +// along with cdb. If not, see . + + +extern crate tempfile; +extern crate libbsv; + + +#[test] +fn simple_db_has_object() { + let temp_dir = tempfile::TempDir::new().unwrap(); + let db = libbsv::SimpleDb::new(temp_dir.path()).unwrap(); + let oid = libbsv::ObjectId::from_str("0001020304050607").unwrap(); + + assert!(!db.has_object(&oid)); + + let mut object_path: std::path::PathBuf = temp_dir.path().into(); + object_path.push("objects"); + object_path.push("0001"); + + std::fs::create_dir_all(&object_path).unwrap(); + + object_path.push("020304050607"); + + std::fs::write(object_path, "test").unwrap(); + + assert!(db.has_object(&oid)); +}