diff --git a/Cargo.lock b/Cargo.lock index ff018184a..daa3798d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,6 +35,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ "cfg-if 1.0.0", + "const-random", + "getrandom", "once_cell", "version_check", ] @@ -57,6 +59,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80a21b9440a626c7fc8573a9e3d3a06b75c7c97754c2949bc7857b90353ca655" +dependencies = [ + "as-slice", +] + [[package]] name = "ambient-authority" version = "0.0.2" @@ -127,6 +138,12 @@ version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +[[package]] +name = "anymap2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" + [[package]] name = "arc-swap" version = "1.6.0" @@ -151,6 +168,15 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "asn1-rs" version = "0.5.2" @@ -929,6 +955,15 @@ dependencies = [ "serde", ] +[[package]] +name = "btoi" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd6407f73a9b8b6162d8a2ef999fe6afd7cc15902ebf42c5cd296addf17e0ad" +dependencies = [ + "num-traits", +] + [[package]] name = "bumpalo" version = "3.13.0" @@ -1030,35 +1065,40 @@ dependencies = [ ] [[package]] -name = "cargo-edit" -version = "0.11.11" +name = "cargo-generate" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435a6490610675d2a027649184df64c709d45f10774a7e5cf4a3f4f2817817db" +checksum = "b7b2f627381dc7523340c606559dddf6083cb2e6134368381da5778638f906d8" dependencies = [ "anyhow", - "cargo_metadata", "clap", - "concolor-control", - "crates-index", - "dunce", - "env_proxy", + "console", + "dialoguer", + "env_logger", "git2", - "hex", + "gix-config", + "heck", "home", - "indexmap", - "native-tls", - "pathdiff", + "ignore", + "indicatif", + "liquid", + "liquid-core", + "liquid-derive", + "liquid-lib", + "log", + "names", + "paste", + "path-absolutize", "regex", + "remove_dir_all", + "rhai", + "sanitize-filename", "semver 1.0.17", "serde", - "serde_derive", - "serde_json", - "subprocess", - "termcolor", + "tempfile", + "thiserror", "toml 0.7.4", - "toml_edit 0.19.9", - "ureq", - "url", + "walkdir", ] [[package]] @@ -1078,7 +1118,7 @@ dependencies = [ "assert_cmd", "async-trait", "bollard", - "cargo-edit", + "cargo-generate", "cargo_metadata", "chrono", "clap", @@ -1182,9 +1222,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.0" +version = "4.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93aae7a4192245f70fe75dd9157fc7b4a5bf53e88d30bd4396f7d8f9284d5acc" +checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" dependencies = [ "clap_builder", "clap_derive", @@ -1193,16 +1233,15 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.0" +version = "4.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f423e341edefb78c9caba2d9c7f7687d0e72e89df3ce3394554754393ac3990" +checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" dependencies = [ "anstream", "anstyle", "bitflags", "clap_lex", "strsim", - "terminal_size", ] [[package]] @@ -1216,9 +1255,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.3.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "191d9573962933b4027f932c600cd252ce27a8ad5979418fe78e43c07996f27b" +checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" dependencies = [ "heck", "proc-macro2", @@ -1228,9 +1267,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" [[package]] name = "colorchoice" @@ -1277,23 +1316,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55b672471b4e9f9e95499ea597ff64941a309b2cdbffcc46f2cc5e2d971fd335" -[[package]] -name = "concolor-control" -version = "0.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7104119c2f80d887239879d0c50e033cd40eac9a3f3561e0684ba7d5d654f4da" -dependencies = [ - "atty", - "bitflags", - "concolor-query", -] - -[[package]] -name = "concolor-query" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad159cc964ac8f9d407cbc0aa44b02436c054b541f2b4b5f06972e1efdc54bc7" - [[package]] name = "console" version = "0.15.7" @@ -1307,6 +1329,28 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "const-random" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368a7a772ead6ce7e1de82bfb04c485f3db8ec744f72925af5735e29a22cc18e" +dependencies = [ + "const-random-macro", + "proc-macro-hack", +] + +[[package]] +name = "const-random-macro" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d7d6ab3c3a2282db210df5f02c4dab6e0a7057af0fb7ebd4070f30fe05c0ddb" +dependencies = [ + "getrandom", + "once_cell", + "proc-macro-hack", + "tiny-keccak", +] + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -1478,27 +1522,6 @@ dependencies = [ "wasmtime-types", ] -[[package]] -name = "crates-index" -version = "0.19.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65aa5fcd68f892b56202f15a18a53308b2d489b728958dbce48d2d1f3bbaa685" -dependencies = [ - "git2", - "hex", - "home", - "memchr", - "num_cpus", - "rayon", - "rustc-hash", - "semver 1.0.17", - "serde", - "serde_derive", - "serde_json", - "smol_str", - "toml 0.7.4", -] - [[package]] name = "crc" version = "3.0.1" @@ -1601,6 +1624,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -1641,6 +1670,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "cvt" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ae9bf77fbf2d39ef573205d554d87e86c12f1994e9ea335b0651b9b278bcf1" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "darling" version = "0.13.4" @@ -1915,16 +1953,6 @@ dependencies = [ "termcolor", ] -[[package]] -name = "env_proxy" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a5019be18538406a43b5419a5501461f0c8b49ea7dfda0cfc32f4e51fc44be1" -dependencies = [ - "log", - "url", -] - [[package]] name = "errno" version = "0.3.1" @@ -2092,6 +2120,20 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "fs_at" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15550ecca96ea332ec143fb450701074143b70d358e50b32b1f847ccff2e1cf7" +dependencies = [ + "aligned", + "cfg-if 1.0.0", + "cvt", + "libc", + "nix 0.26.2", + "windows-sys 0.48.0", +] + [[package]] name = "funty" version = "2.0.0" @@ -2252,9 +2294,9 @@ dependencies = [ [[package]] name = "git2" -version = "0.16.0" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be36bc9e0546df253c0cc41fd0af34f5e92845ad8509462ec76672fac6997f5b" +checksum = "7b989d6a7ca95a362cf2cfc5ad688b3a467be1f87e480b8dad07fee8c79b0044" dependencies = [ "bitflags", "libc", @@ -2265,6 +2307,232 @@ dependencies = [ "url", ] +[[package]] +name = "gix-actor" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc22b0cdc52237667c301dd7cdc6ead8f8f73c9f824e9942c8ebd6b764f6c0bf" +dependencies = [ + "bstr", + "btoi", + "gix-date", + "itoa", + "nom", + "thiserror", +] + +[[package]] +name = "gix-config" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbad5ce54a8fc997acc50febd89ec80fa6e97cb7f8d0654cb229936407489d8" +dependencies = [ + "bstr", + "gix-config-value", + "gix-features 0.28.1", + "gix-glob", + "gix-path", + "gix-ref", + "gix-sec", + "log", + "memchr", + "nom", + "once_cell", + "smallvec", + "thiserror", + "unicode-bom", +] + +[[package]] +name = "gix-config-value" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d09154c0c8677e4da0ec35e896f56ee3e338e741b9599fae06075edd83a4081c" +dependencies = [ + "bitflags", + "bstr", + "gix-path", + "libc", + "thiserror", +] + +[[package]] +name = "gix-date" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96271912ce39822501616f177dea7218784e6c63be90d5f36322ff3a722aae2" +dependencies = [ + "bstr", + "itoa", + "thiserror", + "time", +] + +[[package]] +name = "gix-features" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b76f9a80f6dd7be66442ae86e1f534effad9546676a392acc95e269d0c21c22" +dependencies = [ + "gix-hash 0.10.4", + "libc", + "sha1_smol", + "walkdir", +] + +[[package]] +name = "gix-features" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf69b0f5c701cc3ae22d3204b671907668f6437ca88862d355eaf9bc47a4f897" +dependencies = [ + "gix-hash 0.11.1", + "libc", +] + +[[package]] +name = "gix-fs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b37a1832f691fdc09910bd267f9a2e413737c1f9ec68c6e31f9e802616278a9" +dependencies = [ + "gix-features 0.29.0", +] + +[[package]] +name = "gix-glob" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e43efd776bc543f46f0fd0ca3d920c37af71a764a16f2aebd89765e9ff2993" +dependencies = [ + "bitflags", + "bstr", +] + +[[package]] +name = "gix-hash" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a258595457bc192d1f1c59d0d168a1e34e2be9b97a614e14995416185de41a7" +dependencies = [ + "hex", + "thiserror", +] + +[[package]] +name = "gix-hash" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078eec3ac2808cc03f0bddd2704cb661da5c5dc33b41a9d7947b141d499c7c42" +dependencies = [ + "hex", + "thiserror", +] + +[[package]] +name = "gix-lock" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c693d7f05730fa74a7c467150adc7cea393518410c65f0672f80226b8111555" +dependencies = [ + "gix-tempfile", + "gix-utils", + "thiserror", +] + +[[package]] +name = "gix-object" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df068db9180ee935fbb70504848369e270bdcb576b05c0faa8b9fd3b86fc017" +dependencies = [ + "bstr", + "btoi", + "gix-actor", + "gix-features 0.28.1", + "gix-hash 0.10.4", + "gix-validate", + "hex", + "itoa", + "nom", + "smallvec", + "thiserror", +] + +[[package]] +name = "gix-path" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32370dce200bb951df013e03dff35b4233fc7a89458642b047629b91734a7e19" +dependencies = [ + "bstr", + "thiserror", +] + +[[package]] +name = "gix-ref" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e909396ed3b176823991ccc391c276ae2a015e54edaafa3566d35123cfac9d" +dependencies = [ + "gix-actor", + "gix-features 0.28.1", + "gix-hash 0.10.4", + "gix-lock", + "gix-object", + "gix-path", + "gix-tempfile", + "gix-validate", + "memmap2", + "nom", + "thiserror", +] + +[[package]] +name = "gix-sec" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8ffa5bf0772f9b01de501c035b6b084cf9b8bb07dec41e3afc6a17336a65f47" +dependencies = [ + "bitflags", + "dirs 4.0.0", + "gix-path", + "libc", + "windows 0.43.0", +] + +[[package]] +name = "gix-tempfile" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71a0d32f34e71e86586124225caefd78dabc605d0486de580d717653addf182" +dependencies = [ + "gix-fs", + "libc", + "once_cell", + "parking_lot 0.12.1", + "tempfile", +] + +[[package]] +name = "gix-utils" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c10b69beac219acb8df673187a1f07dde2d74092f974fb3f9eb385aeb667c909" +dependencies = [ + "fastrand", +] + +[[package]] +name = "gix-validate" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd629d3680773e1785e585d76fd4295b740b559cad9141517300d99a0c8c049" +dependencies = [ + "bstr", + "thiserror", +] + [[package]] name = "glob" version = "0.3.1" @@ -2390,9 +2658,6 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] [[package]] name = "hkdf" @@ -2611,7 +2876,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows 0.48.0", ] [[package]] @@ -2869,6 +3134,16 @@ dependencies = [ "simple_asn1", ] +[[package]] +name = "kstring" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3066350882a1cd6d950d055997f379ac37fd39f81cd4d8ed186032eb3c5747" +dependencies = [ + "serde", + "static_assertions", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -2889,9 +3164,9 @@ checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "libgit2-sys" -version = "0.14.1+1.5.0" +version = "0.15.2+1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a07fb2692bc3593bda59de45a502bb3071659f2c515e28c71e728306b038e17" +checksum = "a80df2e11fb4a61f4ba2ab42dbe7f74468da143f1a75c74e11dee7c813f694fa" dependencies = [ "cc", "libc", @@ -2920,9 +3195,9 @@ dependencies = [ [[package]] name = "libssh2-sys" -version = "0.2.23" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" +checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" dependencies = [ "cc", "libc", @@ -2962,6 +3237,63 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +[[package]] +name = "liquid" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eefc214b0f57977e0036be6646a7ef9799b14456ae77a84808ddbe0c4cf326fb" +dependencies = [ + "doc-comment", + "liquid-core", + "liquid-derive", + "liquid-lib", + "serde", +] + +[[package]] +name = "liquid-core" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5bf9a2ede54bdea60a387ded9bc9236d594210afb73ab55f4cbd53599711d3" +dependencies = [ + "anymap2", + "itertools", + "kstring", + "liquid-derive", + "num-traits", + "pest", + "pest_derive", + "regex", + "serde", + "time", +] + +[[package]] +name = "liquid-derive" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2438da425fd380eb2719a2a5880149697eea32a160e83b63e7848c1bee300406" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.16", +] + +[[package]] +name = "liquid-lib" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4feb5c6363bdac5b5238725e296ed9efbe88576f07819970519f29ee29d0b11e" +dependencies = [ + "itertools", + "liquid-core", + "once_cell", + "percent-encoding", + "regex", + "time", + "unicode-segmentation", +] + [[package]] name = "lock_api" version = "0.4.9" @@ -3065,6 +3397,15 @@ dependencies = [ "rustix 0.37.19", ] +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.5" @@ -3179,6 +3520,15 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +[[package]] +name = "names" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bddcd3bf5144b6392de80e04c347cd7fab2508f6df16a85fc496ecd5cec39bc" +dependencies = [ + "rand", +] + [[package]] name = "native-tls" version = "0.2.11" @@ -3217,6 +3567,18 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "nix" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", + "static_assertions", +] + [[package]] name = "nom" version = "7.1.3" @@ -3236,6 +3598,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "normpath" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec60c60a693226186f5d6edf073232bfb6464ed97eb22cf3b01c1e8198fd97f5" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -3287,6 +3658,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -3572,10 +3952,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" [[package]] -name = "pathdiff" -version = "0.2.1" +name = "path-absolutize" +version = "3.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "0f1d4993b16f7325d90c18c3c6a3327db7808752db8d208cea0acee0abd52c52" +dependencies = [ + "path-dedot", +] + +[[package]] +name = "path-dedot" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d55e486337acb9973cdea3ec5638c1b3bcb22e573b2b7b41969e0c744d5a15e" +dependencies = [ + "once_cell", +] [[package]] name = "pbkdf2" @@ -3601,6 +3993,50 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +[[package]] +name = "pest" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e68e84bfb01f0507134eac1e9b410a12ba379d064eab48c50ba4ce329a527b70" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b79d4c71c865a25a4322296122e3924d30bc8ee0834c8bfc8b95f7f054afbfb" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c435bf1076437b851ebc8edc3a18442796b30f1728ffea6262d59bbe28b077e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.16", +] + +[[package]] +name = "pest_meta" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "745a452f8eb71e39ffd8ee32b3c5f51d03845f99786fa9b68db6ff509c505411" +dependencies = [ + "once_cell", + "pest", + "sha2 0.10.6", +] + [[package]] name = "petgraph" version = "0.6.3" @@ -3762,6 +4198,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + [[package]] name = "proc-macro2" version = "1.0.58" @@ -3886,9 +4328,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quote" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -4051,6 +4493,22 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +[[package]] +name = "remove_dir_all" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23895cfadc1917fed9c6ed76a8c2903615fa3704f7493ff82b364c6540acc02b" +dependencies = [ + "aligned", + "cfg-if 1.0.0", + "cvt", + "fs_at", + "lazy_static", + "libc", + "normpath", + "windows-sys 0.45.0", +] + [[package]] name = "reqwest" version = "0.11.18" @@ -4155,12 +4613,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01ff60778f96fb5a48adbe421d21bf6578ed58c0872d712e7e08593c195adff8" dependencies = [ "comma", - "nix", + "nix 0.25.1", "regex", "tempfile", "thiserror", ] +[[package]] +name = "rhai" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd29fa1f740be6dc91982013957e08c3c4232d7efcfe19e12da87d50bad47758" +dependencies = [ + "ahash 0.8.3", + "bitflags", + "instant", + "num-traits", + "rhai_codegen", + "smallvec", + "smartstring", +] + +[[package]] +name = "rhai_codegen" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db74e3fdd29d969a0ec1f8e79171a6f0f71d0429293656901db382d248c4c021" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "ring" version = "0.16.20" @@ -4416,6 +4900,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "sanitize-filename" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c502bdb638f1396509467cb0580ef3b29aa2a45c5d43e5d84928241280296c" +dependencies = [ + "lazy_static", + "regex", +] + [[package]] name = "schannel" version = "0.1.21" @@ -4629,6 +5123,12 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha1_smol" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" + [[package]] name = "sha2" version = "0.9.9" @@ -5045,12 +5545,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] -name = "smol_str" -version = "0.2.0" +name = "smartstring" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" +checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" dependencies = [ - "serde", + "autocfg", + "static_assertions", + "version_check", ] [[package]] @@ -5073,17 +5575,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "socks" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" -dependencies = [ - "byteorder", - "libc", - "winapi", -] - [[package]] name = "spin" version = "0.5.2" @@ -5213,6 +5704,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strfmt" version = "0.2.4" @@ -5257,16 +5754,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "subprocess" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2e86926081dda636c546d8c5e641661049d7562a68f5488be4a1f7f66f6086" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "subtle" version = "2.4.1" @@ -5389,16 +5876,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "terminal_size" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6bf6f19e9f8ed8d4048dc22981458ebcf406d67e94cd422e5ecd73d63b3237" -dependencies = [ - "rustix 0.37.19", - "windows-sys 0.48.0", -] - [[package]] name = "termtree" version = "0.4.1" @@ -5463,6 +5940,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" dependencies = [ "itoa", + "libc", + "num_threads", "serde", "time-core", "time-macros", @@ -5483,6 +5962,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -6056,6 +6544,12 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +[[package]] +name = "ucd-trie" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" + [[package]] name = "unarray" version = "0.1.4" @@ -6077,6 +6571,12 @@ version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +[[package]] +name = "unicode-bom" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63ec69f541d875b783ca40184d655f2927c95f0bffd486faa83cd3ac3529ec32" + [[package]] name = "unicode-ident" version = "1.0.8" @@ -6122,25 +6622,6 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" -[[package]] -name = "ureq" -version = "2.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338b31dd1314f68f3aabf3ed57ab922df95ffcd902476ca7ba3c4ce7b908c46d" -dependencies = [ - "base64 0.13.1", - "log", - "native-tls", - "once_cell", - "rustls 0.20.8", - "serde", - "serde_json", - "socks", - "url", - "webpki", - "webpki-roots", -] - [[package]] name = "url" version = "2.3.1" @@ -6853,6 +7334,21 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04662ed0e3e5630dfa9b26e4cb823b817f1a9addda855d973a9458c236556244" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows" version = "0.48.0" diff --git a/cargo-shuttle/Cargo.toml b/cargo-shuttle/Cargo.toml index 0c937311b..d7425789b 100644 --- a/cargo-shuttle/Cargo.toml +++ b/cargo-shuttle/Cargo.toml @@ -11,7 +11,6 @@ homepage = "https://www.shuttle.rs" anyhow = { workspace = true } async-trait = { workspace = true } bollard = { workspace = true } -cargo-edit = { version = "0.11.9", features = ["cli"] } cargo_metadata = { workspace = true } chrono = { workspace = true } clap = { workspace = true, features = ["env"] } @@ -23,9 +22,7 @@ dirs = { workspace = true } dunce = "1.0.3" flate2 = { workspace = true } futures = { workspace = true } -# This needs to be 0.16.0 for its dependency on libgit2-sys to be compatible -# with cargo 0.69.0's dependency on libgit2-sys. -git2 = "0.16.0" +git2 = "0.17.2" home = { workspace = true } headers = { workspace = true } indicatif = "0.17.3" @@ -56,6 +53,7 @@ url = "2.3.1" uuid = { workspace = true, features = ["v4"] } webbrowser = "0.8.2" semver = "1.0.17" +cargo-generate = "0.18.3" [dependencies.shuttle-common] workspace = true diff --git a/cargo-shuttle/src/init.rs b/cargo-shuttle/src/init.rs index f10c93974..1b3c77dea 100644 --- a/cargo-shuttle/src/init.rs +++ b/cargo-shuttle/src/init.rs @@ -1,13 +1,14 @@ -use std::fs::{read_to_string, File}; -use std::io::Write; -use std::path::{Path, PathBuf}; - -use anyhow::{bail, Result}; -use cargo_edit::{find, get_latest_dependency, registry_url}; +use std::{ + fs::{read_to_string, OpenOptions}, + io::{ErrorKind, Write}, + path::{Path, PathBuf}, +}; + +use anyhow::{anyhow, Context, Result}; +use cargo_generate::{GenerateArgs, TemplatePath, Vcs}; use indoc::indoc; use shuttle_common::project::ProjectName; -use toml_edit::{value, Array, Document, Table}; -use url::Url; +use toml_edit::{value, Document}; #[derive(Clone, Copy, Debug, PartialEq, Eq, strum::Display, strum::EnumIter)] #[strum(serialize_all = "kebab-case")] @@ -50,1465 +51,234 @@ impl Template { } pub trait ShuttleInit { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ); - fn get_boilerplate_code_for_framework(&self) -> &'static str; + fn get_repo_url(&self) -> &'static str; + fn get_sub_path(&self) -> Option<&'static str>; } pub struct ShuttleInitActixWeb; impl ShuttleInit for ShuttleInitActixWeb { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ) { - set_key_value_dependency_version( - "actix-web", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "shuttle-actix-web", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tokio", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - indoc! {r#" - use actix_web::{get, web::ServiceConfig}; - use shuttle_actix_web::ShuttleActixWeb; - - #[get("/")] - async fn hello_world() -> &'static str { - "Hello World!" - } - - #[shuttle_runtime::main] - async fn actix_web( - ) -> ShuttleActixWeb { - let config = move |cfg: &mut ServiceConfig| { - cfg.service(hello_world); - }; - - Ok(config.into()) - }"#} + fn get_sub_path(&self) -> Option<&'static str> { + Some("actix-web/hello-world") } } pub struct ShuttleInitAxum; impl ShuttleInit for ShuttleInitAxum { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ) { - set_key_value_dependency_version( - "axum", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "shuttle-axum", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tokio", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - indoc! {r#" - use axum::{routing::get, Router}; - - async fn hello_world() -> &'static str { - "Hello, world!" - } - - #[shuttle_runtime::main] - async fn axum() -> shuttle_axum::ShuttleAxum { - let router = Router::new().route("/", get(hello_world)); - - Ok(router.into()) - }"#} + fn get_sub_path(&self) -> Option<&'static str> { + Some("axum/hello-world") } } pub struct ShuttleInitRocket; impl ShuttleInit for ShuttleInitRocket { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ) { - set_key_value_dependency_version( - "rocket", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "shuttle-rocket", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tokio", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - indoc! {r#" - #[macro_use] - extern crate rocket; - - #[get("/")] - fn index() -> &'static str { - "Hello, world!" - } - - #[shuttle_runtime::main] - async fn rocket() -> shuttle_rocket::ShuttleRocket { - let rocket = rocket::build().mount("/", routes![index]); - - Ok(rocket.into()) - }"#} + fn get_sub_path(&self) -> Option<&'static str> { + Some("rocket/hello-world") } } pub struct ShuttleInitTide; impl ShuttleInit for ShuttleInitTide { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ) { - set_key_value_dependency_version( - "shuttle-tide", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tokio", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tide", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - indoc! {r#" - #[shuttle_runtime::main] - async fn tide() -> shuttle_tide::ShuttleTide<()> { - let mut app = tide::new(); - app.with(tide::log::LogMiddleware::new()); - - app.at("/").get(|_| async { Ok("Hello, world!") }); - - Ok(app.into()) - }"#} + fn get_sub_path(&self) -> Option<&'static str> { + Some("tide/hello-world") } } pub struct ShuttleInitPoem; impl ShuttleInit for ShuttleInitPoem { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ) { - set_key_value_dependency_version( - "poem", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "shuttle-poem", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tokio", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - indoc! {r#" - use poem::{get, handler, Route}; - use shuttle_poem::ShuttlePoem; - - #[handler] - fn hello_world() -> &'static str { - "Hello, world!" - } - - #[shuttle_runtime::main] - async fn poem() -> ShuttlePoem { - let app = Route::new().at("/", get(hello_world)); - - Ok(app.into()) - }"#} + fn get_sub_path(&self) -> Option<&'static str> { + Some("poem/hello-world") } } pub struct ShuttleInitSalvo; impl ShuttleInit for ShuttleInitSalvo { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ) { - set_key_value_dependency_version( - "salvo", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "shuttle-salvo", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tokio", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - indoc! {r#" - use salvo::prelude::*; - - #[handler] - async fn hello_world(res: &mut Response) { - res.render(Text::Plain("Hello, world!")); - } - - #[shuttle_runtime::main] - async fn salvo() -> shuttle_salvo::ShuttleSalvo { - let router = Router::with_path("hello").get(hello_world); - - Ok(router.into()) - }"#} + fn get_sub_path(&self) -> Option<&'static str> { + Some("salvo/hello-world") } } pub struct ShuttleInitSerenity; impl ShuttleInit for ShuttleInitSerenity { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ) { - set_key_value_dependency_version( - "anyhow", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - set_inline_table_dependency_version( - "serenity", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - dependencies["serenity"]["default-features"] = value(false); - - set_inline_table_dependency_features( - "serenity", - dependencies, - vec![ - "client".into(), - "gateway".into(), - "rustls_backend".into(), - "model".into(), - ], - ); - - set_key_value_dependency_version( - "shuttle-secrets", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "shuttle-serenity", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tokio", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tracing", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - indoc! {r#" - use anyhow::anyhow; - use serenity::async_trait; - use serenity::model::channel::Message; - use serenity::model::gateway::Ready; - use serenity::prelude::*; - use shuttle_secrets::SecretStore; - use tracing::{error, info}; - - struct Bot; - - #[async_trait] - impl EventHandler for Bot { - async fn message(&self, ctx: Context, msg: Message) { - if msg.content == "!hello" { - if let Err(e) = msg.channel_id.say(&ctx.http, "world!").await { - error!("Error sending message: {:?}", e); - } - } - } - - async fn ready(&self, _: Context, ready: Ready) { - info!("{} is connected!", ready.user.name); - } - } - - #[shuttle_runtime::main] - async fn serenity( - #[shuttle_secrets::Secrets] secret_store: SecretStore, - ) -> shuttle_serenity::ShuttleSerenity { - // Get the discord token set in `Secrets.toml` - let token = if let Some(token) = secret_store.get("DISCORD_TOKEN") { - token - } else { - return Err(anyhow!("'DISCORD_TOKEN' was not found").into()); - }; - - // Set gateway intents, which decides what events the bot will be notified about - let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT; - - let client = Client::builder(&token, intents) - .event_handler(Bot) - .await - .expect("Err creating client"); - - Ok(client.into()) - }"#} + fn get_sub_path(&self) -> Option<&'static str> { + Some("serenity/hello-world") } } pub struct ShuttleInitPoise; impl ShuttleInit for ShuttleInitPoise { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ) { - set_key_value_dependency_version( - "anyhow", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "poise", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "shuttle-poise", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "shuttle-secrets", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tokio", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tracing", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - indoc! {r#" - use anyhow::Context as _; - use poise::serenity_prelude as serenity; - use shuttle_secrets::SecretStore; - use shuttle_poise::ShuttlePoise; - - struct Data {} // User data, which is stored and accessible in all command invocations - type Error = Box; - type Context<'a> = poise::Context<'a, Data, Error>; - - /// Responds with "world!" - #[poise::command(slash_command)] - async fn hello(ctx: Context<'_>) -> Result<(), Error> { - ctx.say("world!").await?; - Ok(()) - } - - #[shuttle_runtime::main] - async fn poise(#[shuttle_secrets::Secrets] secret_store: SecretStore) -> ShuttlePoise { - // Get the discord token set in `Secrets.toml` - let discord_token = secret_store - .get("DISCORD_TOKEN") - .context("'DISCORD_TOKEN' was not found")?; - - let framework = poise::Framework::builder() - .options(poise::FrameworkOptions { - commands: vec![hello()], - ..Default::default() - }) - .token(discord_token) - .intents(serenity::GatewayIntents::non_privileged()) - .setup(|ctx, _ready, framework| { - Box::pin(async move { - poise::builtins::register_globally(ctx, &framework.options().commands).await?; - Ok(Data {}) - }) - }) - .build() - .await - .map_err(shuttle_runtime::CustomError::new)?; - - Ok(framework.into()) - }"#} + fn get_sub_path(&self) -> Option<&'static str> { + Some("poise/hello-world") } } pub struct ShuttleInitTower; impl ShuttleInit for ShuttleInitTower { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ) { - set_inline_table_dependency_version( - "hyper", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - set_inline_table_dependency_features("hyper", dependencies, vec!["full".to_string()]); - - set_key_value_dependency_version( - "shuttle-tower", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tokio", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_inline_table_dependency_version( - "tower", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - set_inline_table_dependency_features("tower", dependencies, vec!["full".to_string()]); + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - indoc! {r#" - use std::convert::Infallible; - use std::future::Future; - use std::pin::Pin; - use std::task::{Context, Poll}; - - #[derive(Clone)] - struct HelloWorld; - - impl tower::Service> for HelloWorld { - type Response = hyper::Response; - type Error = Infallible; - type Future = Pin> + Send + Sync>>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, _req: hyper::Request) -> Self::Future { - let body = hyper::Body::from("Hello, world!"); - let resp = hyper::Response::builder() - .status(200) - .body(body) - .expect("Unable to create the `hyper::Response` object"); - - let fut = async { Ok(resp) }; - - Box::pin(fut) - } - } - - #[shuttle_runtime::main] - async fn tower() -> shuttle_tower::ShuttleTower { - let service = HelloWorld; - - Ok(service.into()) - }"#} + fn get_sub_path(&self) -> Option<&'static str> { + Some("tower/hello-world") } } pub struct ShuttleInitWarp; impl ShuttleInit for ShuttleInitWarp { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ) { - set_key_value_dependency_version( - "shuttle-warp", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "tokio", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_key_value_dependency_version( - "warp", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - indoc! {r#" - use warp::Filter; - use warp::Reply; - - #[shuttle_runtime::main] - async fn warp() -> shuttle_warp::ShuttleWarp<(impl Reply,)> { - let route = warp::any().map(|| "Hello, World!"); - Ok(route.boxed().into()) - }"#} + fn get_sub_path(&self) -> Option<&'static str> { + Some("warp/hello-world") } } pub struct ShuttleInitThruster; impl ShuttleInit for ShuttleInitThruster { - fn set_cargo_dependencies( - &self, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - get_dependency_version_fn: GetDependencyVersionFn, - ) { - set_key_value_dependency_version( - "shuttle-thruster", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); - - set_inline_table_dependency_version( - "thruster", - dependencies, - manifest_path, - url, - false, - get_dependency_version_fn, - ); - - set_inline_table_dependency_features( - "thruster", - dependencies, - vec!["hyper_server".to_string()], - ); - - set_key_value_dependency_version( - "tokio", - dependencies, - manifest_path, - url, - true, - get_dependency_version_fn, - ); + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - indoc! {r#" - use thruster::{ - context::basic_hyper_context::{generate_context, BasicHyperContext as Ctx, HyperRequest}, - m, middleware_fn, App, HyperServer, MiddlewareNext, MiddlewareResult, ThrusterServer, - }; - - #[middleware_fn] - async fn hello(mut context: Ctx, _next: MiddlewareNext) -> MiddlewareResult { - context.body("Hello, World!"); - Ok(context) - } - - #[shuttle_runtime::main] - async fn thruster() -> shuttle_thruster::ShuttleThruster> { - let server = HyperServer::new( - App::::create(generate_context, ()).get("/", m![hello]), - ); - - Ok(server.into()) - }"#} + fn get_sub_path(&self) -> Option<&'static str> { + Some("thruster/hello-world") } } pub struct ShuttleInitNoOp; impl ShuttleInit for ShuttleInitNoOp { - fn set_cargo_dependencies( - &self, - _dependencies: &mut Table, - _manifest_path: &Path, - _url: &Url, - _get_dependency_version_fn: GetDependencyVersionFn, - ) { + fn get_repo_url(&self) -> &'static str { + "http://github.com/shuttle-hq/shuttle-examples.git" } - fn get_boilerplate_code_for_framework(&self) -> &'static str { - "" + fn get_sub_path(&self) -> Option<&'static str> { + Some("custom/none") } } -pub fn cargo_init(path: PathBuf, name: ProjectName) -> Result<()> { - let mut cmd = std::process::Command::new("cargo"); - cmd.arg("init") - .arg("--bin") - .arg("--name") - .arg(name.as_str()) - .arg(path.as_os_str()); +pub fn cargo_generate(path: PathBuf, name: &ProjectName, framework: Template) -> Result<()> { + let config = framework.init_config(); + println!(r#" Creating project "{name}" in {path:?}"#); - let output = cmd.output().expect("Failed to initialize with cargo init."); - let stderr = String::from_utf8(output.stderr).unwrap(); - if !output.status.success() { - bail!("cargo init failed:\n{}", stderr) - } - print!("{}", stderr); + let generate_args = GenerateArgs { + init: true, + template_path: TemplatePath { + git: Some(config.get_repo_url().to_string()), + auto_path: config.get_sub_path().map(str::to_string), + ..Default::default() + }, + name: Some(name.to_string()), // appears to do nothing... + destination: Some(path.clone()), + vcs: Some(Vcs::Git), + ..Default::default() + }; + cargo_generate::generate(generate_args) + .with_context(|| "Failed to initialize with cargo generate.")?; + + set_crate_name(&path, name.as_str()).with_context(|| "Failed to set crate name.")?; + remove_shuttle_toml(&path); + create_gitignore_file(&path).with_context(|| "Failed to create .gitignore file.")?; Ok(()) } -/// Performs shuttle init on the existing files generated by `cargo init [path]`. -pub fn cargo_shuttle_init(path: PathBuf, framework: Template) -> Result<()> { - println!(r#" Setting up "{framework}" template"#); - let cargo_toml_path = path.join("Cargo.toml"); - let mut cargo_doc = read_to_string(cargo_toml_path.clone()) - .unwrap() - .parse::() - .unwrap(); - - // Add publish: false to avoid accidental `cargo publish` - cargo_doc["package"]["publish"] = value(false); - - // Get `[dependencies]` table - let dependencies = cargo_doc["dependencies"] - .as_table_mut() - .expect("manifest to have a dependencies table"); - - let manifest_path = find(Some(path.as_path())).unwrap(); - let url = registry_url(manifest_path.as_path(), None).expect("Could not find registry URL"); - - let init_config = framework.init_config(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, // TODO: disallow pre-release when releasing 0.12? - get_latest_dependency_version, - ); +// since I can't get cargo-generate to do this for me... +fn set_crate_name(path: &Path, name: &str) -> Result<()> { + // read the Cargo.toml file + let mut path = path.to_path_buf(); + path.push("Cargo.toml"); - // Set framework-specific dependencies to the `dependencies` table - init_config.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - get_latest_dependency_version, - ); + let toml_str = read_to_string(&path)?; + let mut doc = toml_str.parse::()?; - // Truncate Cargo.toml and write the updated `Document` to it - let mut cargo_toml = File::create(cargo_toml_path)?; + // change the name + doc["package"]["name"] = value(name); - cargo_toml.write_all(cargo_doc.to_string().as_bytes())?; - - // Write boilerplate to `src/main.rs` file - let main_path = path.join("src").join("main.rs"); - let boilerplate = init_config.get_boilerplate_code_for_framework(); - if !boilerplate.is_empty() { - write_main_file(boilerplate, &main_path)?; - } + // write the Cargo.toml file back out + std::fs::write(&path, doc.to_string())?; Ok(()) } -/// Sets dependency version for a key-value pair: -/// `crate_name = "version"` -fn set_key_value_dependency_version( - crate_name: &str, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - flag_allow_prerelease: bool, - get_dependency_version_fn: GetDependencyVersionFn, -) { - let dependency_version = - get_dependency_version_fn(crate_name, flag_allow_prerelease, manifest_path, url); - dependencies[crate_name] = value(dependency_version); -} +/* +Currently Shuttle.toml only has a project name override. +This project name will already be in use, so the file is useless. -/// Sets dependency version for an inline table: -/// `crate_name = { version = "version" }` -fn set_inline_table_dependency_version( - crate_name: &str, - dependencies: &mut Table, - manifest_path: &Path, - url: &Url, - flag_allow_prerelease: bool, - get_dependency_version_fn: GetDependencyVersionFn, -) { - let dependency_version = - get_dependency_version_fn(crate_name, flag_allow_prerelease, manifest_path, url); - dependencies[crate_name]["version"] = value(dependency_version); -} +If we start putting more things in Shuttle.toml we may wish to re-evaluate. +*/ +fn remove_shuttle_toml(path: &Path) { + let mut path = path.to_path_buf(); + path.push("Shuttle.toml"); -/// Sets dependency features for an inline table: -/// `crate_name = { features = ["some-feature"] }` -fn set_inline_table_dependency_features( - crate_name: &str, - dependencies: &mut Table, - features: Vec, -) { - let features = Array::from_iter(features); - dependencies[crate_name]["features"] = value(features); + // this file only exists for some of the examples, it's fine if we don't find it + _ = std::fs::remove_file(path); } -/// Abstract type for `get_latest_dependency_version` function. -type GetDependencyVersionFn = fn(&str, bool, &Path, &Url) -> String; - -/// Gets the latest version for a dependency of `crate_name`. -/// This is a wrapper function for `cargo_edit::get_latest_dependency` function. -fn get_latest_dependency_version( - crate_name: &str, - flag_allow_prerelease: bool, - manifest_path: &Path, - url: &Url, -) -> String { - let latest_version = - get_latest_dependency(crate_name, flag_allow_prerelease, manifest_path, Some(url)) - .unwrap_or_else(|_| panic!("Could not query the latest version of {crate_name}")); - let latest_version = latest_version - .version() - .expect("No latest shuttle-service version available"); - - latest_version.to_string() -} +fn create_gitignore_file(path: &Path) -> Result<()> { + let mut path = path.to_path_buf(); + path.push(".gitignore"); + + let mut file = match OpenOptions::new().create_new(true).write(true).open(path) { + Ok(f) => f, + Err(e) => { + match e.kind() { + ErrorKind::AlreadyExists => { + // if the example already has a .gitignore file, just use that + return Ok(()); + } + _ => { + return Err(anyhow!(e)); + } + } + } + }; -/// Writes `boilerplate` code to the specified `main.rs` file path. -pub fn write_main_file(boilerplate: &'static str, main_path: &Path) -> Result<()> { - let mut main_file = File::create(main_path)?; - main_file.write_all(boilerplate.as_bytes())?; + file.write_all(indoc! {b" + /target + Secrets*.toml + "})?; Ok(()) } - -#[cfg(test)] -mod shuttle_init_tests { - use super::*; - - fn cargo_toml_factory() -> Document { - indoc! {r#" - [dependencies] - "#} - .parse::() - .unwrap() - } - - fn mock_get_latest_dependency_version( - _crate_name: &str, - _flag_allow_prerelease: bool, - _manifest_path: &Path, - _url: &Url, - ) -> String { - "1.0".to_string() - } - - #[test] - fn test_set_inline_table_dependency_features() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - - set_inline_table_dependency_features( - "shuttle-service", - dependencies, - vec!["builder".to_string()], - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-service = { features = ["builder"] } - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_inline_table_dependency_version() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_inline_table_dependency_version( - "shuttle-service", - dependencies, - &manifest_path, - &url, - false, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-service = { version = "1.0" } - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_key_value_dependency_version() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-service", - dependencies, - &manifest_path, - &url, - false, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-service = "1.0" - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - #[test] - fn test_set_cargo_dependencies_actix_web() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitActixWeb.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-runtime = "1.0" - actix-web = "1.0" - shuttle-actix-web = "1.0" - tokio = "1.0" - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_cargo_dependencies_axum() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitAxum.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-runtime = "1.0" - axum = "1.0" - shuttle-axum = "1.0" - tokio = "1.0" - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_cargo_dependencies_rocket() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitRocket.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-runtime = "1.0" - rocket = "1.0" - shuttle-rocket = "1.0" - tokio = "1.0" - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_cargo_dependencies_tide() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitTide.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-runtime = "1.0" - shuttle-tide = "1.0" - tokio = "1.0" - tide = "1.0" - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_cargo_dependencies_tower() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitTower.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-runtime = "1.0" - hyper = { version = "1.0", features = ["full"] } - shuttle-tower = "1.0" - tokio = "1.0" - tower = { version = "1.0", features = ["full"] } - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_cargo_dependencies_poem() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitPoem.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-runtime = "1.0" - poem = "1.0" - shuttle-poem = "1.0" - tokio = "1.0" - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_cargo_dependencies_salvo() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitSalvo.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-runtime = "1.0" - salvo = "1.0" - shuttle-salvo = "1.0" - tokio = "1.0" - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_cargo_dependencies_serenity() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitSerenity.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-runtime = "1.0" - anyhow = "1.0" - serenity = { version = "1.0", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } - shuttle-secrets = "1.0" - shuttle-serenity = "1.0" - tokio = "1.0" - tracing = "1.0" - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_cargo_dependencies_poise() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitPoise.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-runtime = "1.0" - anyhow = "1.0" - poise = "1.0" - shuttle-poise = "1.0" - shuttle-secrets = "1.0" - tokio = "1.0" - tracing = "1.0" - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_cargo_dependencies_warp() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitWarp.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-runtime = "1.0" - shuttle-warp = "1.0" - tokio = "1.0" - warp = "1.0" - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - #[test] - fn test_set_cargo_dependencies_thruster() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://shuttle.rs").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitThruster.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - mock_get_latest_dependency_version, - ); - - let expected = indoc! {r#" - [dependencies] - shuttle-runtime = "1.0" - shuttle-thruster = "1.0" - thruster = { version = "1.0", features = ["hyper_server"] } - tokio = "1.0" - "#}; - - assert_eq!(cargo_toml.to_string(), expected); - } - - // TODO: unignore this test when we publish shuttle-rocket - #[ignore] - #[test] - /// Makes sure that Rocket uses allow_prerelease flag when fetching the latest version - fn test_get_latest_dependency_version_rocket() { - let mut cargo_toml = cargo_toml_factory(); - let dependencies = cargo_toml["dependencies"].as_table_mut().unwrap(); - let manifest_path = PathBuf::new(); - let url = Url::parse("https://github.com/rust-lang/crates.io-index").unwrap(); - - set_key_value_dependency_version( - "shuttle-runtime", - dependencies, - &manifest_path, - &url, - true, - mock_get_latest_dependency_version, - ); - - ShuttleInitRocket.set_cargo_dependencies( - dependencies, - &manifest_path, - &url, - get_latest_dependency_version, - ); - - let version = dependencies["rocket"].as_str().unwrap(); - - let expected = get_latest_dependency("rocket", true, &manifest_path, Some(&url)) - .expect("Could not query the latest version of rocket") - .version() - .expect("no rocket version found") - .to_string(); - - assert_eq!(version, expected); - } -} diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 58389cd53..9bcf7bb18 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -217,8 +217,14 @@ impl Shuttle { }; // 5. Initialize locally - init::cargo_init(path.clone(), project_args.name.clone().unwrap())?; - init::cargo_shuttle_init(path.clone(), framework)?; + init::cargo_generate( + path.clone(), + project_args + .name + .as_ref() + .expect("to have a project name provided"), + framework, + )?; println!(); // 6. Confirm that the user wants to create the project environment on Shuttle diff --git a/examples b/examples index b3fc6c0ef..8ecd22030 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit b3fc6c0efff97ce2d0cfbe64cf057092b7b37a71 +Subproject commit 8ecd22030cdf6393ea701eb35343d19d8eee5471